Временные шаблоны вложенных шаблонов для MSVC2010? - PullRequest
3 голосов
/ 21 ноября 2011

Я наткнулся на ту же проблему вложенных шаблонов, описанную здесь .

Следующий код:

# 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.

  • Если невозможно, как реорганизовать / переработать код, чтобы избежать случая с вложенными шаблонами?

1 Ответ

3 голосов
/ 21 ноября 2011

На самом деле, определение - это способ поддержки кросс-компилятора во многих местах, где вам нужен вложенный шаблон. Boost тоже это делает!

Альтернатива состоит в том, чтобы разделить все ваши вложенные шаблоны в дополнительных заголовках и иметь различные включаемые пути в MSVC и GCC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...