我知道以下工作:
#pragma once
#include <string>
class testclass
{
private:
std::string _data;
public:
template<class T>
testclass(const T&);
};
#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))
{}
所以这是分割模板函数声明和实现的成功方法,但它有一些缺点。其中一个是必须硬编码您希望调用函数的所有类型,这是一个拖累。如果功能很小,你最终会编写的代码比你没有模板化的代码要多......
我想知道这样的事情是否可行:
#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))
{}
答案 0 :(得分:2)
我想知道这样的事情是否可行:
不,那是不可能的。
您的选择是:
让testclass
的每个用户都包含定义。
在一个包含定义的编译单元中定义testclass::testclass
的每个所需实例。
没有其他选择。
答案 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文件,可以尝试以下技巧:
并且你可能必须将你的包含从* .tpp移到test.h的头部,但我不确定,只是玩它。