1

以下代码在 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 : '::'
4

2 回答 2

6

这是一个 MSVC 错误。

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

他们的解决方法是提供所有函数参数。 (恶心)

在这里承认。

于 2013-02-11T12:46:27.423 回答
3

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

以下摘录应引用标准的右侧部分(第 14.1.9 节):

默认模板参数是在模板参数中 = 之后指定的模板参数 (14.3)。可以为不是模板参数包 (14.5.3) 的任何类型的模板参数(类型、非类型、模板)指定默认模板参数。可以在模板声明中指定默认模板参数。不应在出现在成员类之外的类模板成员的定义的模板参数列表中指定默认模板参数。不应在友元类模板声明中指定默认模板参数。如果友元函数模板声明指定了默认模板参数,则该声明应为定义,并且应是翻译单元中函数模板的唯一声明。

于 2013-02-11T12:46:45.633 回答