我只是在学习C ++中的模板编程,并且链接器无法找到我的class'es构造函数的定义。可能是什么原因?代码如下。
Logger.h
template <class T>
class Logger {
public:
Logger(NodeHandle& nh, char* topic, short pubFrequency);
virtual ~Logger();
void publish();
T& getMsg();
private:
NodeHandle& nh_;
Publisher publisher_;
T msg_;
const char* topic_;
const short pubFrequency_;
};
Logger.cpp
template <class T>
Logger<T>::Logger(NodeHandle& nh, char* topic, short pubFrequency) :
nh_(nh),
topic_(topic),
pubFrequency_(pubFrequency),
publisher_(topic_, static_cast<Msg*>(&msg_)) {}
template <class T>
Logger<T>::~Logger() {}
然后,当我尝试在main.cpp中创建一个Logger实例
时NodeHandle nh;
Logger<std_msgs::String> logger(nh, "test", 10);
链接器抱怨:
undefined reference to `Logger<std_msgs::String>::Logger(NodeHandle&, char*, short)'
我做错了什么?没有编译器错误,所以所有包含都在那里,我想。
答案 0 :(得分:6)
您需要将模板化实现放在标题中。
任何引用模板化代码的代码都需要“看到”实现,以便编译器可以从模板生成代码。