gpt4 book ai didi

c++ - MSVC2010 的嵌套模板解决方法?

转载 作者:太空狗 更新时间:2023-10-29 21:27:54 25 4
gpt4 key购买 nike

我偶然发现了嵌套模板的相同问题 here .

以下代码:

# 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 ++' : unable to match function definition to an existing declaration1>  definition1>    'Outer::Inner &Outer::Inner::operator ++(void)'1>  existing declarations1>    'Outer::Inner Outer::Inner::operator ++(int)'1>    'Outer::Inner &Outer::Inner::operator ++(void)' <- This is what it wants !

When removing the template keyword, MSVC compiles fine while gcc becomes angry :

error: non-template 'Inner' used as templatenote: use 'Outer::template Inner' to indicate that it is a template

Accoding to the post linked above, MSVC seems to be the faulty. So my questions :

  • How to adapt the above code in order to compile with both MSVC and GCC ?I really want to avoid this awful preprocessor hack :

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

然后在 MSVC 不喜欢 template 的地方使用 nested_template 取悦它。

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

最佳答案

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

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

关于c++ - MSVC2010 的嵌套模板解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8208203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com