我想创建一个泛型类,其中包含一个显示一条消息的方法,如果类的类型是int,另一个是double的时候。这是我的代码:
template<class T>
class A {
public:
template <T> void B();
};
template<class T>
void A<int>::B{
//some code here
}
template<class T>
void A<double>::B{
//some code here
}
我收到了以下错误:
'double': illegal type for non-type template parameter '__formal'
'A<int>::B': unable to match function definition to an existing declaration
提前感谢任何解决方案。
答案 0 :(得分:2)
有几件事:
B
没有理由成为模板。您想专注于A
B
是一种方法。方法接受参数。定义方法时,省略了括号()
<>
代码:
template<class T>
class A {
public:
void B();
};
template<>
void A<int>::B(){
std::cout << "A<int>::B" << std::endl;
}
template<>
void A<double>::B(){
std::cout << "A<double>::B" << std::endl;
}
如果你觉得有必要让B
成为一个模板,我应该注意,一般来说,不会对函数执行模板特化。这主要是因为它们不能部分专业化,而且编写重载几乎总是更好。在你的情况下,B
没有参数,所以有一些论据支持专业化。
通常情况下,人们会使用标签调度方法,再加上辅助函数,以便他们可以通过利用重载来选择所需的函数。以下是针对您的案例的标签调度的简单示例:
template<class T>
class A {
public:
template<class U>
void B()
{
B(ATag<U>{});
}
private:
template<class U>
struct ATag{};
void B(ATag<int>)
{
std::cout << "B<int>" << std::endl;
}
void B(ATag<double>)
{
std::cout << "B<double>" << std::endl;
}
};