имя типа вне шаблона - PullRequest
20 голосов
/ 20 мая 2011

Это в VS2010sp1 не компилируется (хотя и компилируется с gcc 4.6):

template<class T>
struct Upcast;

template<>
struct Upcast<signed char>
{
    typedef signed short type;
};

template<>
struct Upcast<char>
{
    typedef typename std::conditional<std::is_signed<char>::value,short, unsigned short>::type type;
};

int main()
{
    Upcast<char>::type a;
    return 0;
}

Ошибка VS:

Error   1   error C2899: typename cannot be used outside a template declaration

Какая команда права?VS или gcc?

Ответы [ 3 ]

26 голосов
/ 20 мая 2011

VS прав на C ++ 03.GCC прав на C ++ 0x.

Теперь GCC может иметь смысл разрешить это и в режиме C ++ 03 (есть много вещей, которые настоящие компиляторы не диагностируют в режиме C ++ 03, которые действительно действительны только в C ++ 0x), и для VS вполне может быть разумно отклонить его в режиме C ++ 03.

Больше не имеет значения, происходит ли использование typename QualifiedName в шаблоне или нет, вC ++ 0x.То есть для C ++ 0x совершенно допустимо следующее:

#include<vector>

int main() {
  typename std::vector<int> v;
}

В C ++ 03 typename можно использовать только внутри шаблона.И явная специализация в вашем коде не шаблон.Нет template<typename T ...> предложений (все параметры в вашем коде фиксированы).

8 голосов
/ 20 мая 2011

В соответствии с C ++ 03, typename и template ключевые слова не допускаются нигде вне шаблона, включая явные (полные) специализации шаблона. Таким образом, MSVC ++ является правильным согласно C ++ 03

Согласно C ++ 0x этот код является правильным.

3 голосов
/ 20 мая 2011

В этом конкретном случае может показаться, что VS2010 прав в отклонении кода:

14.6 / 5

Ключевое слово typename должно применяться только к квалифицированным именам, но теимена не должны быть зависимыми.Ключевое слово typename должно использоваться только в тех контекстах, в которых могут использоваться зависимые имена.Это включает объявления и определения шаблонов, но исключает явные объявления специализации и явные объявления создания экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...