Определение шаблона функции-члена Inner с аргументом перечисления (не тип)

У меня проблемы с определением и специализацией функции-члена 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
{
};

6

Решение

Прежде всего, вам не хватает typename до Outer<T1>::Inner::Type, Вы должны иметь это, даже в template список типов, потому что Type это зависимый тип.

Во-вторых, ваш синтаксис специализации неправильный (тип входит в <> после имени функции перед скобками, а не в template<>), но даже если бы это было правильно, это не было бы законно. Вы должны специализировать внешний шаблон Outer прежде чем вы сможете полностью специализироваться updateв соответствии с неудачным правилом, касающимся явной специализации шаблона.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]