Неопределенная ссылка на конструктор, универсальный класс - PullRequest
0 голосов
/ 24 июля 2011

Я только изучаю программирование шаблонов на 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() {}

Затем, когда я пытаюсь создать экземпляр Logger в main.cpp

NodeHandle nh; 
Logger<std_msgs::String> logger(nh, "test", 10);

компоновщик жалуется:

undefined reference to `Logger<std_msgs::String>::Logger(NodeHandle&, char*, short)'

Что я делаю не так? Нет ошибок компиляции, так что, я полагаю, есть все включения.

1 Ответ

6 голосов
/ 24 июля 2011

Нужно, чтобы шаблонная реализация находилась в заголовке.

Любой код, ссылающийся на шаблонный код, должен "видеть" реализацию, чтобы компилятор мог генерировать код из шаблона.

...