C++ MSVC2010的嵌套模板解决方案?

C++ MSVC2010的嵌套模板解决方案?,c++,templates,C++,Templates,我偶然发现了上述嵌套模板的相同问题 以下代码: # 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) ;

我偶然发现了上述嵌套模板的相同问题

以下代码:

# 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
}
删除
模板
关键字时,MSVC编译良好,而gcc变得愤怒:

error: non-template 'Inner' used as template note: use 'Outer::template Inner' to indicate that it is a template 然后使用
nested_-template
来取悦MSVC,因为它不喜欢
template

  • 如果不可能,如何重构/重新设计代码以避免嵌套模板的情况

实际上,在许多需要嵌套模板的地方,定义是实现跨编译器支持的方法。Boost也能做到


另一种方法是在额外的头中分离所有嵌套模板,并在MSVC和GCC中使用不同的包含路径。

我不知道这一点。它是在哪个boost库中完成的?我想看看boost开发人员是如何处理它的。@overcoder:IIRC它在
boost::function
库中使用。我认为这不是直接针对MSVC的,但其他编译器也遇到了这个问题。实际上,define应该在Boost的config头中(或者在附近的某个地方)。很高兴听到您的快速响应!我会查出来的。@overcoder:搜索
BOOST\u嵌套的\u模板
,IIRC就是这个名字。@overcode:今天遇到了一个类似的宏,一个用法是在
BOOST.Range
,特别是

error: non-template 'Inner' used as template
note: use 'Outer::template Inner' to indicate that it is a template
# ifdef MSVC
# define nested_template 
# else
# define nested_template template
# endif