模板模板在不同文件中实例化

时间:2015-10-30 12:04:29

标签: c++ templates c++11

我知道以下工作:

test.h

#pragma once

#include <string>

class testclass
{
private:
    std::string _data;
public:

    template<class T> 
    testclass(const T&);

};

TEST.CPP

#include "test.h"

template testclass::testclass(const int&);
template testclass::testclass(const long&);

//function can be called only with `int` and `long`
template<class T> 
testclass::testclass(const T &num)
    : _data(std::to_string(num))
{}

所以这是分割模板函数声明和实现的成功方法,但它有一些缺点。其中一个是必须硬编码您希望调用函数的所有类型,这是一个拖累。如果功能很小,你最终会编写的代码比你没有模板化的代码要多......

我想知道这样的事情是否可行:

TEST.CPP

#include "test.h"

template<class T2> //bogus syntax, but here the point of interest
template testclass::testclass(const T2&);

template<class T> 
testclass::testclass(const T &num)
    : _data(std::to_string(num))
{}

3 个答案:

答案 0 :(得分:2)

  

我想知道这样的事情是否可行:

不,那是不可能的。

您的选择是:

  1. testclass的每个用户都包含定义。

  2. 在一个包含定义的编译单元中定义testclass::testclass的每个所需实例。

  3. 没有其他选择。

答案 1 :(得分:0)

为什么不直接在.h上使用您的课程模板?

#pragma once

#include <string>

template <T>
class testclass
{
private:
    std::string _data;
public:

    testclass(const T& num) : data(std::to_string(num)) {}

};

这样,您可以将您的类用于您想要的任何类型,例如:

testclass<int> test(1);
testclass<double> test(2.0);
...

答案 2 :(得分:0)

我认为这是不可能的,因为在编译阶段你的编译器只能看到你的test.cpp文件,并且不知道它必须实例化这个模板的类型。

因此,如果您只是出于模块化目的而将模板拆分为h / cpp文件,可以尝试以下技巧:

  1. 将您的“test.cpp”文件重命名为“test.tpp”(* .tpp扩展名只显示它的模板类'定义)
  2. 保留* .h文件,但最后添加#include“test.tpp”语句。
  3. 并且你可能必须将你的包含从* .tpp移到test.h的头部,但我不确定,只是玩它。