以下位代码在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 : '::'
答案 0 :(得分:6)
答案 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,该声明应该是一个定义和 应该是函数模板中唯一的声明 翻译单位。