Сегодня мой друг и я много боролись с глупой ошибкой, и я заставляю задуматься о том, как параметры шаблона работают на C++. Рассмотрим следующий код, где я пытаюсь частично специализировать класс attr<MyClass<I>>
где I
является unsigned int
, хотя MyClass
ожидает int
параметр:Параметр шаблона C++ и частичная специализация: сильная или слабая типизация?
#include <iostream>
template<int I>
class MyClass
{
};
template<typename T>
struct attr;
template<unsigned int I>
struct attr<MyClass<I>>
{
};
int main(int argc, char *argv[])
{
attr<MyClass<1>> att;
return 0;
}
g++
терпит неудачу с сообщением об ошибке
main.cpp: In function ‘int main(int, char**)’:
main.cpp:20:22: erreur : aggregate ‘attr<MyClass<1> > att’ has incomplete type and cannot be defined
attr<MyClass<1>> att;
И clang
компилирует его (только предупреждение из-за того, что att
не используется).
Так мне было интересно:
есть что-нибудь в спецификации, которая будет править в пользу одного или другого?
можно ли сказать, что набор параметров шаблона
clang
слабее, чемg++
?