Вопрос был изменен!
Я использую простой способ скрыть свои перечисления от локальных пространств имен — перечисление внутри структуры. Это выглядит примерно так:
struct Color
{
enum Type
{
Red, Green, Black
};
Type t_;
Color(Type t) : t_(t) {}
operator Type () const {return t_;}
private:
template<typename T>
operator T () const;
};
Оператор T () является защитой от неявного приведения типов. Затем я попытался скомпилировать этот код с помощью gcc и keil:
Color n;
int a[9];
a[ (int)n ] = 1;
gcc скомпилировал его без ошибок (что я и ожидал), но Keil дал мне ошибку:
msgstr «недопустимое преобразование типов. operator () недоступен».
Поэтому мой вопрос: какой компилятор прав?
Я знаю о классе enum c ++ 11, но он не поддерживается Keil
Должен ли reinterpret_cast (не c-style () cast) вызывать оператор преобразования типов?
Нет, reinterpret_cast
используется только для нескольких хитрых типов конверсий:
Вам не нужно вообще приводить, чтобы использовать оператор неявного преобразования — вы вообще не предотвратили неявное преобразование. В C ++ 11, если оператор был explicit
тогда вам понадобится static_cast
,
Если вы застряли в C ++ 03 и действительно хотите предотвратить неявное преобразование, но разрешить явное преобразование, то я думаю, что единственное разумное, что нужно сделать, — это предоставить именованную функцию преобразования.
Обновить: Вопрос теперь изменился и задает вопрос о кастинге в стиле C, а не о reinterpret_cast
, Это должно скомпилироваться, так как любое преобразование, которое может быть сделано static_cast
(включая неявные преобразования) также можно выполнить с помощью приведения в стиле C.
Других решений пока нет …