Я наткнулся на ту же проблему вложенных шаблонов, описанную здесь .
Следующий код:
# include <cstdlib> // for std::size_t
template<std::size_t N>
class Outer
{
public :
template<typename T>
class Inner
{
public :
inline Inner<T> & operator ++ (void) ;
inline Inner<T> operator ++ (int) ;
} ;
} ;
template<std::size_t N>
template<typename T>
inline typename Outer<N>::template Inner<T> & Outer<N>::Inner<T>::operator ++ (void)
{ // ^^^^^^^^ Point Of Interest : MSVC is the only one who complains
// preincrement
}
template<std::size_t N>
template<typename T>
inline typename Outer<N>::template Inner<T> Outer<N>::Inner<T>::operator ++ (int)
{ // ^^^^^^^^ Point Of Interest
// postincrement
}
прекрасно компилируется с MinGW 4.5 (т.е. gcc), пока в типе возврата присутствует ключевое слово template
, но это заставляет MSVC2010 жаловаться на несоответствие объявления / определения:
error C2244: 'Outer::Inner::operator ++' : unable to match function definition to an existing declaration
1> definition
1> 'Outer::Inner &Outer::Inner::operator ++(void)'
1> existing declarations
1> 'Outer::Inner Outer::Inner::operator ++(int)'
1> 'Outer::Inner &Outer::Inner::operator ++(void)' <b><- This is what it wants !</b>
При удалении ключевого слова template
MSVC прекрасно компилируется, а gcc начинает сердиться:
error: non-template 'Inner' used as template
note: use 'Outer::template Inner' to indicate that it is a template
Согласно сообщению , указанному выше , MSVC кажется неисправным. Итак, мои вопросы:
Как адаптировать приведенный выше код для компиляции с MSVC и GCC?
Я действительно хочу избежать этого ужасного взлома препроцессора:
# ifdef MSVC
# define nested_template
# else
# define nested_template template
# endif
А затем используйте nested_template
, чтобы понравиться MSVC, где ему не нравится template
.
- Если невозможно, как реорганизовать / переработать код, чтобы избежать случая с вложенными шаблонами?