可以在类模板中专门设置的类模板中的模板函数吗? 它的语法是什么?
以下代码在MSVC2010中提供unable to match function definition to an existing declaration
#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
之外的双重专精。
为什么我这样使用它?在实际场景中,我已经构建了工厂类,使用如下:
Factory<SomePolicy> f;
f.create<MyType>(arg1, arg2, ...)
我需要对create
的特殊类型进行专门化,以防止污染头文件。
答案 0 :(得分:0)
我不相信你可以专注于内部模板而不专门化外部。但是,您可以使用部分专业化:
编辑:似乎只有类可以部分专业化。我再也没有测试过它。您可以找到更多here
template <typename T, typename S>
struct Test
{
void test(const S &s);
};
template <typename T>
struct Test<T, float>
{
void test (const float &s)
{
<<do something>>
}
}
答案 1 :(得分:0)
据我所知你不能。但是您可以像这样重载test
函数:
template <typename T>
struct Test
{
template <typename S>
void test(const S & t);
void test(const double &); // <-- Add this
T member;
};
template <typename T>
// template<> // <-- Remove this
void Test<T>::test(const double & t)
{
std::cout << t << "D \n";
}
这应该完全等同于你想要做的事情。