环境:Microsoft Visual Studio 2010
编码标准:兼容C ++ 0x
我有一个课程模板
template <typename T1, int I>
class A
{
public template <typename T2> void f(T2 x);
/*...*/
};
template <typename T1, int I>
template <typename T2>
void A<T1, I>::f(T2 x)
{
/*...*/
}
以上类的部分专业化
template <int I>
class A<char, I>
{
public template <typename T2> void f(T2 x);
/*...*/
};
那么我可以在下面的部分专业类中专门化成员函数吗?
template <int I>
template <>
void A<char, I>::f<double>(double x)
{
}
谢谢!
注意:我不是在努力,而是在思考它是否适用。如果您了解规则,请轻松评分。
答案 0 :(得分:1)
这是无效的,因为如果不向任何封闭的类模板提供固定模板参数,则无法显式地专门化成员函数。
不兼容C ++ 11,但使用MSVC
Microsoft编译器有一个扩展,允许在类模板中声明显式特化。即使我从未尝试过,但它很可能会接受以下非标准代码
template <int I>
class A<char, I>
{
public:
template <typename T2> void f(T2 x);
template<> void f<double>(double x) {
}
/*...*/
};
更新:Clang编译并报告
// clang++ -fms-extensions main1.cpp
main1.cpp:10:21: warning: explicit specialization of 'f' within class scope is a
Microsoft extension [-Wmicrosoft]
template<> void f<double>(double x) {
^
兼容C ++ 11 / C ++ 03
这里的方式是重载而不是专业化
template <int I>
class A<char, I>
{
public:
template <typename T2> void f(T2 x);
void f(double x) {
}
/*...*/
};