成员函数模板参数默认值

时间:2013-02-11 12:42:55

标签: c++ templates function-templates default-arguments

以下位代码在GCC 4.5.3中编译,但在VS 2008和2010中无法编译。这是由于VS编译器错误还是标准禁止给出默认函数模板参数值?

#include <cstdlib>

struct Bar
{
    enum Group{ A , B , C };
};

struct Foo
{
    template<typename T>
    static void getSome( typename T::Group = T::A );
};

template<typename T>
void Foo::getSome( typename T::Group )
{
};

int main()
{
    Foo::getSome<Bar>();            // Does not compile in VS 2008 & 2010 (compiles in gcc 4.5.3)
    Foo::getSome<Bar>( Bar::C );    // Compiles in VS 2008 and gcc 4.5.3
    return EXIT_SUCCESS;
}

错误消息

prog.cpp(11) : error C2589: '::' : illegal token on right side of '::'
prog.cpp(11) : error C2059: syntax error : '::'

2 个答案:

答案 0 :(得分:6)

这是一个MSVC错误。

错误在于使用默认参数处理模板函数,正如您可能猜到的那样。

他们的解决方法是提供所有功能参数。 (呸)

已确认here

答案 1 :(得分:3)

我认为g++在编译你的代码片段时会遵守标准。

以下摘录应该是对标准右边部分的引用(第14.1.9节):

  

默认模板参数是指定的模板参数(14.3)   after = in template-parameter。默认的模板参数可能是   为任何类型的模板参数指定(类型,非类型,   模板)不是模板参数包(14.5.3)。默认值   可以在模板声明中指定template-argument。一个   默认模板参数不得在。中指定   template-parameter-class成员定义的列表   出现在成员班级之外的模板。默认值   不应在友元类模板中指定template-argument   宣言。如果朋友函数模板声明指定了   default template-argument,该声明应该是一个定义和   应该是函数模板中唯一的声明   翻译单位。