c ++中成员函数模板的专业化

时间:2016-11-11 12:47:09

标签: c++ templates

我想创建一个泛型类,其中包含一个显示一条消息的方法,如果类的类型是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

提前感谢任何解决方案。

1 个答案:

答案 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;
}

Demo

如果你觉得有必要让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;
    }
};

tag dispatch demo