嵌套模板解决方案的MSVC2010

Nested templates workaround for MSVC2010?

本文关键字:MSVC2010 解决方案 嵌套      更新时间:2023-10-16

我偶然发现了这里描述的嵌套模板的相同问题。

以下代码:

# 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
}
只要在返回类型中存在template关键字,

在MinGW 4.5(即gcc)中编译良好,但这使得MSVC2010抱怨声明/定义不匹配:

<>之前error C2244: 'Outer::Inner::operator ++':无法将函数定义与现有声明匹配1>定义1> 'Outer::Inner &Outer::Inner::operator ++(void)'1>现有声明1> 'Outer::Inner::Inner::operator ++(int)'1> 'Outer::Inner &Outer::Inner::operator ++(void)' <-这就是它想要的!>之前

当删除template关键字时,MSVC可以正常编译,而gcc会生气:

<>之前错误:非模板"内部"被用作模板注意:使用'Outer::template Inner'来表示它是一个模板之前

根据上面链接的帖子,MSVC似乎是错误的。所以我的问题是:

  • 如何适应上述代码,以便与MSVC和GCC同时编译?我真的想避免这个可怕的预处理器hack:

    # ifdef MSVC
    # define nested_template 
    # else
    # define nested_template template
    # endif
    

然后用nested_template来取悦不喜欢template的MSVC。

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

实际上,在许多需要嵌套模板的地方,定义是获得交叉编译器支持的方法。Boost也可以!

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