У меня проблемы с определением и специализацией функции-члена update()
внутреннего класса Outer<T1>::Inner
это основано на нетиповом (enum) аргументе.
#include <cstdlib>
template<typename T1>
struct Outer
{
struct Inner
{
enum Type{ A , B , C };
template<Type T2>
void update();
};
};
// Definition
template<typename T1>
template<Outer<T1>::Inner::Type T2>
void Outer<T1>::Inner::update()
{
}
// Specialization
template<typename T1>
template<Outer<T1>::Inner::A >
void Outer<T1>::Inner::update()
{
}
int main()
{
return EXIT_SUCCESS;
}
Я получаю следующее сообщение об ошибке в GCC 4.5.3
prog.cpp:17:28: error: ‘Outer::Inner::Type’ is not a type
prog.cpp:18:6: error: prototype for ‘void Outer<T1>::Inner::update()’ does not match any in class ‘Outer<T1>::Inner’
prog.cpp:11:15: error: candidate is: template<class T1> template<Outer<T1>::Inner::Type T2> void Outer<T1>::Inner::update()
prog.cpp:24:28: error: ‘Outer::Inner::A’ is not a type
prog.cpp:25:6: error: prototype for ‘void Outer<T1>::Inner::update()’ does not match any in class ‘Outer<T1>::Inner’
prog.cpp:11:15: error: candidate is: template<class T1> template<Outer<T1>::Inner::Type T2> void Outer<T1>::Inner::update()
Кстати, в отличие от GCC, Visual Studio 2008 не может скомпилировать следующее
template<typename T1>
struct Outer
{
struct Inner
{
enum Type{ A , B , C };
template<Type T2>
struct Deep;
};
};
template<typename T1>
template<typename Outer<T1>::Inner::Type T2>
struct Outer<T1>::Inner::Deep
{
};
Прежде всего, вам не хватает typename
до Outer<T1>::Inner::Type
, Вы должны иметь это, даже в template
список типов, потому что Type
это зависимый тип.
Во-вторых, ваш синтаксис специализации неправильный (тип входит в <>
после имени функции перед скобками, а не в template<>
), но даже если бы это было правильно, это не было бы законно. Вы должны специализировать внешний шаблон Outer
прежде чем вы сможете полностью специализироваться update
в соответствии с неудачным правилом, касающимся явной специализации шаблона.
Других решений пока нет …