对构造函数的未定义引用,泛型类

Undefined reference to constructor, generic class

本文关键字:泛型类 引用 未定义 构造函数      更新时间:2023-10-16

我正在学习c++模板编程,并且有一个问题,链接器无法找到我的类的构造函数的定义。原因是什么?下面的代码。

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)'

我做错了什么?没有编译错误,所以我猜所有的包含都在那里。

您需要将模板实现放在标题中。

任何引用模板化代码的代码都需要"看到"实现,这样编译器才能从模板中生成代码。