специализация шаблона c ++ - ошибка компоновщика нескольких определений - PullRequest
12 голосов
/ 28 марта 2011

Мой третий вопрос здесь сегодня ;-), но я действительно новичок в программировании на c ++ и перегрузке операторов.

Я пытаюсь сделать следующее:

terminallog.hh

//snipped code

class Terminallog {
public:

    Terminallog();
    Terminallog(int);
    virtual ~Terminallog();

    template <class T>
    Terminallog & operator<<(const T &v);
    template <class T>
    Terminallog & operator<<(const std::vector<T> &v);
    template <class T>
    Terminallog & operator<<(const T v[]);
    Terminallog & operator<<(const char v[]);

//snipped code
};

//snipped code
template <class T>
Terminallog &Terminallog::operator<<(const T &v) {
    std::cout << std::endl;
    this->indent();
    std::cout << v;
    return *this;
}

template <class T>
Terminallog &Terminallog::operator<<(const std::vector<T> &v) {
    for (unsigned int i = 0; i < v.size(); i++) {
        std::cout << std::endl;
        this->indent();
        std::cout << "Element " << i << ": " << v.at(i);
    }
    return *this;
}

template <class T>
Terminallog &Terminallog::operator<<(const T v[]) {
    unsigned int elements = sizeof (v) / sizeof (v[0]);
    for (unsigned int i = 0; i < elements; i++) {
        std::cout << std::endl;
        this->indent();
        std::cout << "Element " << i << ": " << v[i];
    }
    return *this;
}

Terminallog &Terminallog::operator<<(const char v[]) {
    std::cout << std::endl;
    this->indent();
    std::cout << v;
    return *this;
}
//snipped code

Попытка скомпилировать этот код выдает ошибку компоновщика:

g++ src/terminallog.cc inc/terminallog.hh testmain.cpp -o test -Wall -Werror 
/tmp/ccifyOpr.o: In function `Terminallog::operator<<(char const*)':
testmain.cpp:(.text+0x0): multiple definition of `Terminallog::operator<<(char const*)'
/tmp/cccnEZlA.o:terminallog.cc:(.text+0x0): first defined here
collect2: ld returned 1 exit status

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

Было бы здорово, если бы кто-то мог показать мне мою ошибку

Большое спасибо

ftiaronsem

1 Ответ

13 голосов
/ 28 марта 2011

Эта функция

Terminallog &Terminallog::operator<<(const char v[]) {
    std::cout << std::endl;
    this->indent();
    std::cout << v;
    return *this;
}

это не шаблон, а обычная функция-член. Если этот файл .h включен в несколько файлов .cpp, он вызовет ошибку множественного определения, которую вы видите. Если вы объявите его inline, компилятор разрешит несколько определений, и ваша ошибка должна быть исправлена.

inline
Terminallog &Terminallog::operator<<(const char v[]) {
...