源文件中的C ++部分特化

时间:2014-06-30 12:01:39

标签: c++ templates header-files partial-specialization

我有一个关于c ++中部分类模板特化的问题。我有一个A类,有两个模板T,U。然后我想要两个具有独占方法print_me()的类特化,只对这两个特化可见。除此之外,我需要完全专门的成员函数add_integer / add_double。当我在头文件中实现这些方法时,它编译得很好。但是我真的喜欢我在源文件中的实现,这对于完全专用的函数来说没有问题,但是对于部分函数来说。我收到以下代码的错误:

test.h:27:25: error: declaration of ‘void A<int, U>::print_me()’ outside of class is not definition [-fpermissive]
test.h:30:28: error: declaration of ‘void A<double, U>::print_me()’ outside of class is not definition [-fpermissive]

但是如果我在头文件中省略了print_me()的声明,我会得到一个未定义的引用错误,我理解,正如我的编译器所知,在编译时要实例化哪些方法。

test.h:

//Primary Template Class
template <typename T, typename U>
class A{};

//Partial Specialization 1
template <typename U>
class A<int,U>
{
public:
void add_double(double a);
void print_me();
};

//Partial Specialization 2
template <typename U>
class A<double,U>
{
public:
void add_int(int a);
void print_me();
};

//explicit specialization
template <>
void A<int,double>::add_double(double a);

//explicit specialization
template <>
void A<double,int>::add_int(int a);

//partial specialization
template <typename U>
void A<int,U>::print_me();

//partial specialization
template <typename U>
void A<double,U>::print_me();

TEST.CPP

#include "test.h"

template <>
void A<int,double>::add_double(double a){}

template <>
void A<double,int>::add_int(int a){}


template <typename U>
void A<int,U>::print_me(){};

template <typename U>
void A<double,U>::print_me(){};

用于测试目的main.cpp

#include "test.h"

int main()
{
A<int,double> * a_0=new A<int,double>;
A<double,int> * a_1=new A<double,int>;

a_0->add_double(1.1);
a_0->print_me();

a_1->add_int(1);
a_1->print_me();

return 0;
}

那么有没有可能在源文件中实现print_me()方法?在这种情况下,完全和部分专用成员函数之间的区别是什么?

任何提示都将不胜感激

1 个答案:

答案 0 :(得分:1)

正如@Angew所提到的,部分特化仍然是一个模板,这只是你print_me方法的蓝图。 你需要实例化你的模板功能。为此,您可以在test.cpp文件中使用显式实例化或隐式实例化。

明确的实例化:

template
void A<double,int>::add_int(int a);

隐式实例化
只需在test.cpp中定义一个虚函数,它将调用完全专用的模板函数print我(你不必使用这个虚函数):

void instatiatePrintMe()
{ 
    A<int, double> a;
    a.print_me();
}

您可以在此处阅读以获取更多信息:C++ - Defining class template (header/source file)