今天寫代碼的時候,發現g++好像不支持模板成員函數的全特化??创a:
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++下報錯,還不是很清楚。