类模板中的模板函数可以在类模板外进行专门化吗?它的语法是什么?
在MSVC2010中,以下代码会提示“无法将函数定义与现有声明匹配”的错误。
#include <iostream>
template <typename T>
struct Test
{
template <typename S>
void test(const S & t);
//this works
//template<> void test(const double & t) { std::cout << t << "D \n"; }
T member;
};
//this doesn't work
template <typename T>
template <>
void Test<T>::test(const double & t)
{
std::cout << t << "D \n";
}
int main()
{
Test<int> t;
t.test(7.0);
}
编辑
我可以按照答案中的建议使用重载,因为我使用它的方式略有不同,具体如下:
#include <iostream>
template <typename T>
struct Test
{
template <typename S>
void test() { std::cout << "Any type \n"; }
template <>
void test<double>() { std::cout << "Double! \n"; }
T member;
};
int main()
{
Test<int> t1;
Test<int> t2;
t1.test<float>();
t2.test<double>();
}
我希望你能为struct
外的double类型提供专门的翻译。
你可能会问我为什么要这样使用?实际情况是,我已经建立了一个工厂类,用法如下:
Factory<SomePolicy> f;
f.create<MyType>(arg1, arg2, ...)
我需要针对特定类型进行create
的专门化,以避免污染头文件。
template <>
不能跟随非空的template <typename S>
。因此,你只能写类似于这样的代码:template <> template <typename S> void Test<double>::test(const S & t){/*...*/}
,但这显然不是你想要的。而且你也不能在类声明中声明或定义特化。 - Constructor