2013-05-21 5 views
0

Вопрос был изменен!c-style cast cast and operator()

Я использую простой способ скрыть свои перечисления из локальных пространств имен - перечисление внутри структуры. Это примерно так:

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; 

НКУ скомпилирован без ошибок (которым является то, что я ожидал), но Keil даваемого мне ошибку:. «неверного типа преобразования оператора() недоступен ».

Так что мой вопрос: какой компилятор прав?

Я знаю о C++ 11 класса перечислимого, но не поддерживается Keil Теперь

+2

Ни g ++, ни clang ++ не компилируют этот код для меня, даже после исправления определения 'Color n;'. – Mat

+0

Какую версию g ++ вы используете? Каковы ошибки? – Amomum

+0

'invalid cast from type 'Color' to type 'int'': GCC 4.6.3, 4.7.2, 4.8.0; 'reinterpret_cast от 'Цвет' до 'int' не допускается': clang 3.3 – Mat

ответ

4

Should reinterpret_cast (not c-style() cast) call type conversion operator?

Нет, reinterpret_cast используется только для нескольких изворотливых типов переходов:

  • преобразования указателей на целые числа и обратно
  • преобразования между указателями (и ссылки) для несвязанных типов

Вам не нужно использовать броузер для использования оператора неявного преобразования - вы вообще не предотвращали неявное преобразование. В C++ 11, если оператор был explicit, вам понадобится static_cast.

Если вы застряли в C++ 03, и вы действительно хотите предотвратить неявное преобразование, но разрешите явное преобразование, то я думаю, что единственная разумная вещь - предоставить именованную функцию преобразования.

Обновление: Вопрос теперь изменен и спрашивает о литье в стиле C, а не о reinterpret_cast. Это должно скомпилироваться, поскольку любое преобразование, которое может быть выполнено с помощью static_cast (включая неявные преобразования), также может быть выполнено с использованием C-стиля.

+0

Итак, личный оператор не делает невозможным невозможное преобразование? o_o – Amomum

+0

Еще спасибо за ответ, я сам догадался о названной функции, но оператор был бы более прямолинейным. Я хочу, чтобы reinterpret_cast просто ... ну, интерпретировал блок памяти без каких-либо вопросов, что так всегда. – Amomum

+1

@Amomum: Нет; 'operator Type()' является общедоступным, а 'Type' может использоваться как индекс массива. –