今天写代码的时候,发现g++好像不支持模板成员函数的全特化。看代码:
class A
{
public:
template <typename T>
T f(T val);
template <>
int f<int>(int val);
};
我用的是g++ 3.4.2 mingw版本。编译上面这段代码时,错误信息如下:
5: error: invalid explicit specialization before ‘>’ token
5: error: explicit specialization in non-namespace scope `class A’
如果把f的定义放到全局作用域中,就不会出错。而上面这段代码在VC++ 8.0下可以编译通过。运行起来也没有问题。别的编译器我没有试过。
Update:多谢周星星的指点,比较“常规”的写法如下:
class A
{
public:
template <typename T>
T f(T val);
};
template <typename T>
T A::f(T val)
{
// …
}
template <>
int A::f<int>(int val)
{
//…
}
这种写法就没有任何问题(在g++ 3.4.2和VC++ 8.0下均表现正常)。至于为什么前面的写法导致g++下报错,还不是很清楚。
class A
{
public:
template <typename T>
T f(T val);
template <>
int f<int>(int val);
};
我用的是g++ 3.4.2 mingw版本。编译上面这段代码时,错误信息如下:
5: error: invalid explicit specialization before ‘>’ token
5: error: explicit specialization in non-namespace scope `class A’
如果把f的定义放到全局作用域中,就不会出错。而上面这段代码在VC++ 8.0下可以编译通过。运行起来也没有问题。别的编译器我没有试过。
Update:多谢周星星的指点,比较“常规”的写法如下:
class A
{
public:
template <typename T>
T f(T val);
};
template <typename T>
T A::f(T val)
{
// …
}
template <>
int A::f<int>(int val)
{
//…
}
这种写法就没有任何问题(在g++ 3.4.2和VC++ 8.0下均表现正常)。至于为什么前面的写法导致g++下报错,还不是很清楚。
引用:http://www.cppblog.com/chengmeng/archive/2006/10/12/13604.html
>> 本文固定链接: http://www.vcgood.com/archives/1470
感谢楼主共享啊