以下示例代码无法编译:
#include <iostream>
template<bool Enable>
struct BaseTemplate
{
template< typename Policy>
void templateMethod(Policy& policy);
};
template<bool Enable>
template<typename Policy>
void BaseTemplate<Enable>::templateMethod<Policy>(Policy& policy)
{
std::cout << "template method" << std::endl;
};
int main()
{
BaseTemplate<true> base;
float v = 3.0;
base.templateMethod(v);
};
失败并出现此错误:
$ g++-4.8 -std=c++11 mtempl.cpp -o ./xMtempl
mtempl.cpp:15:65: error: function template partial specialization ‘templateMethod<Policy>’ is not allowed
void BaseTemplate<Enable>::templateMethod<Policy>(Policy& policy)
现在,这让我很烦恼:这不是专业化,我只是将声明模板与声明分开定义!
如果我更换
template<bool Enable>
template<typename Policy>
void BaseTemplate<Enable>::templateMethod<Policy>(Policy& policy)
{
std::cout << "template method" << std::endl;
};
用这个
template<bool Enable, typename Policy>
void BaseTemplate<Enable>::templateMethod<Policy>(Policy& policy)
{
std::cout << "template method" << std::endl;
};
我得到的错误是:
mtempl.cpp:16:65: error: template-id ‘templateMethod<Policy>’ in declaration of primary template
void BaseTemplate<Enable>::templateMethod<Policy>(Policy& policy)
^
mtempl.cpp:16:6: error: prototype for ‘void BaseTemplate<Enable>::templateMethod(Policy&)’ does not match any in class ‘BaseTemplate<Enable>’
void BaseTemplate<Enable>::templateMethod<Policy>(Policy& policy)
^
mtempl.cpp:9:7: error: candidate is: template<bool Enable> template<class Policy> void BaseTemplate<Enable>::templateMethod(Policy&)
void templateMethod(Policy& policy);
问题是什么? 如何与声明分开定义方法模板?
答案 0 :(得分:1)
template<bool Enable>
template<typename Policy>
void BaseTemplate<Enable>::templateMethod<Policy>(Policy& policy)
{
// stuff
};
此是专业化的。删除<Policy>
以获得简单的定义。
template<bool Enable>
template<typename Policy>
void BaseTemplate<Enable>::templateMethod(Policy& policy)
{
// stuff
};
顺便说一句,在方法结束时你有额外的分号。