将方法模板与其声明分开定义

时间:2015-07-06 15:26:26

标签: c++ templates

以下示例代码无法编译:

#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);

问题是什么? 如何与声明分开定义方法模板?

1 个答案:

答案 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
};
顺便说一句,在方法结束时你有额外的分号。