2016-11-11 92 views
0

我想创建一个泛型类,其中包含一个显示一条消息的方法,如果类的类型是int而另一个是double的。这里是我的代码:C++中成员函数模板的专门化

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

您的代码不匹配你的错误。请提供[mcve] – NathanOliver

+2

另外,您不应将类似模板参数名称用于功能模板作为类模板。 – NathanOliver

+2

你确定要'B'也是一个模板吗?从你的描述看来,你似乎希望'B'是类模板'A'的普通非模板成员函数。 – Angew

回答

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

+0

非常感谢!我在程序中得到了括号,只是忘了把它们包含在这里。现在一切正常 –