Есть два типа enum. Кое-где в программе переменные одного из типов сравниваются с константами другого. Компилятор жрет без проблем, видимо, потому что считает их int, не заморачиваясь. А мне надо отловить эти ошибочные сравнения на этапе компиляции. Что бы подкрутить? Как-то уломать компилятор делать strict проверки типов?
Upd: Компилятор - под Visual Studio.
December 14 2009, 16:26:32 UTC 2 years ago
December 14 2009, 16:30:21 UTC 2 years ago
December 14 2009, 16:39:54 UTC 2 years ago
Но с интересом почитаю ответы, а вдруг и прада - можно? :)
December 14 2009, 16:42:27 UTC 2 years ago
December 14 2009, 16:42:30 UTC 2 years ago
#ifdef DEBUG
class Enum1
{
private:
int _v;
Enum1(int v) : _v(v) {}
public:
static Enum1 V1() { Enum1 e(0); return e; }
static Enum1 V2() { Enum1 e(1); return e; }
static bool operator == (const Enum1 &other) { return _v == other._v; }
};
#else
enum Enum1 {V1,V2};
#endif
December 14 2009, 16:43:53 UTC 2 years ago
December 14 2009, 16:44:13 UTC 2 years ago Edited: December 14 2009, 16:44:52 UTC
Внутри определения класса:
static Enum1 V1;
static Enum1 V2;
Вне определения класса:
Enum1 Enum1::V1 (0);
Enum1 Enum1::V2 (1);
December 14 2009, 16:45:36 UTC 2 years ago
2 years ago
2 years ago
2 years ago
December 14 2009, 18:05:06 UTC 2 years ago
2 years ago
December 14 2009, 19:42:13 UTC 2 years ago
December 14 2009, 19:50:47 UTC 2 years ago
December 14 2009, 21:39:43 UTC 2 years ago
enum Enum1
{
E1 = 1
};
enum Enum2
{
E2 = 2
};
void test()
{
Enum1 e1;
e1 = E1; // ok
e1 = (Enum1)E2; // ok
e1 = E2; // error C2440: '=' : cannot convert from 'Enum2' to 'Enum1'
}
// Проверить в среде Visual Studio 2005 не могу.
December 15 2009, 01:09:14 UTC 2 years ago
December 15 2009, 06:19:43 UTC 2 years ago
December 15 2009, 06:49:53 UTC 2 years ago
December 15 2009, 06:54:33 UTC 2 years ago
December 15 2009, 07:03:30 UTC 2 years ago
Я тут три дня форумы шерстил в поисках магической формулы...
December 15 2009, 07:04:11 UTC 2 years ago
December 16 2009, 11:42:41 UTC 2 years ago Edited: December 16 2009, 11:44:28 UTC
в строках где разнотипное сравнение VS2003 дает ошибку типа
main.cpp(235) : error C2440: 'initializing' : cannot convert from 'const char [4]' to 'float'
There is no context in which this conversion is possible
main.cpp(251) : see reference to function template instantiation 'bool operator !=<E2,E1>(T1,T2)' being compiled
with
[
T1=E2,
T2=E1
]
болдовая строка - как раз место сравнения
Если же разнотипных сравнений уже нет - все будет компилироваться без ошибок
December 16 2009, 11:50:59 UTC 2 years ago
December 16 2009, 16:45:32 UTC 2 years ago
December 16 2009, 21:35:22 UTC 2 years ago
March 3 2010, 19:38:22 UTC 2 years ago
March 3 2010, 21:38:17 UTC 2 years ago
За двадцать лет ни разу не случилось работать с wchar.
2 years ago
March 4 2010, 10:43:02 UTC 2 years ago
2 years ago
2 years ago