我有一个关于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()方法?在这种情况下,完全和部分专用成员函数之间的区别是什么?
任何提示都将不胜感激
答案 0 :(得分:1)
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)