Приведенный ниже код прекрасно компилируется с помощью clang, но не компилируется с НКУ (пробовал 4.1.2, 4.5.4 и 4.7.2):
template <typename T>
struct A
{
struct B { };
};
template <typename T>
bool operator==(typename A<T>::B const& b, T const& t);
enum { BAR };
template <typename T>
bool test()
{
return 0 == BAR;
}
Сообщение об ошибке от GCC 4.7.2:
a.cpp: In instantiation of ‘struct A<<anonymous enum> >’:
a.cpp:12:6: required by substitution of ‘template<class T> bool operator==(const typename A<T>::B&, const T&) [with T = <anonymous enum>]’
a.cpp:19:17: required from here
a.cpp:6:12: error: ‘<anonymous enum>’ is/uses anonymous type
a.cpp:6:12: error: trying to instantiate ‘template<class T> struct A<T>::B’
a.cpp:6:12: error: ‘<anonymous enum>’ is/uses anonymous type
a.cpp:6:12: error: trying to instantiate ‘template<class T> struct A<T>::B’
Является НКУ правильно в отклонении кода, или я бью его ошибку?
Постскриптум Я видел эту ошибку при попытке построить один из проектов с открытым исходным кодом. Я попытался сделать наименьший возможный пример, который воспроизводит это.
Это не действительный C ++ в соответствии с оригинальным стандартом:
14.3.1 стандарта гласит:
2 Локальный тип, тип без связи, безымянный тип или
тип, составленный из любого из этих типов, не должен использоваться как
Аргумент шаблона для параметра типа шаблона. [Пример: …
Однако я считаю, что это ограничение было снято по последнему стандарту C ++ 11. Это может объяснить, почему некоторые компиляторы принимают это, а другие отвергают.
Других решений пока нет …