C ++, шаблоны и оператор << (с использованием фреймворка Qt) - PullRequest
1 голос
/ 18 января 2011

Я создаю небольшой класс с именем Output ... Это должно быть чем-то, что облегчит мое программирование с точки зрения записи вывода (например, поддержка большего количества типов для вывода в stdout (например, QString) и так далее ...)

Пока это было хорошо, он работал с QString, но теперь я хотел, чтобы он принимал любой тип в качестве аргумента. Но при компиляции я получаю эту ошибку:

main.cpp: 16: ошибка: неопределенная ссылка на `Output & Output :: operator << (int) '</p>

Вот мои выходные файлы классов .h и .cpp:

.h

#ifndef OUTPUT_H
#define OUTPUT_H

#include <QObject>
#include <QTextStream>

class Output : public QObject
{
    Q_OBJECT

public:
    Output();
    template <class _T> Output& operator<<(const _T& Text);  
signals:

public slots:
};

extern Output out;

#endif // OUTPUT_H

.cpp

#include "output.h"

Output out;

Output::Output()
{
}

template <class _T> Output& Output::operator <<(const _T& Data)
{
    QTextStream s(stdout);

    s.setCodec("UTF-8");
    s<<Data;
    s.flush();
    return *this;
}

Ответы [ 3 ]

4 голосов
/ 18 января 2011

Для создания экземпляра необходим полный код шаблона, поэтому, если вы поместите код в файл .cpp, вы сможете использовать его только внутри этого файла.

3 голосов
/ 18 января 2011

компоновщик прав: в вашем коде нет экземпляра Output::operator << ( const int& ). Чтобы компилятор генерировал код для шаблона, он должен быть виден во время компиляции: поместите определение в заголовочный файл, и проблема будет решена.

2 голосов
/ 18 января 2011

Вам необходимо реализовать свой шаблон в объявлении класса, а не в определении класса. Компилятор C ++ просто не компилирует ваш «Output :: operator <<» для «T = int» в файле .cpp, поскольку он «не знает», что вы будете использовать его с «int» в другом файле .cpp. Перемещение тела «Output :: operator <<» из .cpp в .h решит вашу проблему, так как .h включен в тот же модуль компиляции, где ваш код использует шаблон с «int». К сожалению, я не помню, как правильно реализовать шаблоны в файлах .cpp: (. </p>

...