Ошибка связывания: шаблон перегрузки оператора друга - PullRequest
0 голосов
/ 04 ноября 2010

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

Вот мой тестовый файл:

#include <cargo.h>
#include <iostream>
#include <string>

using namespace std;
using namespace dom;

int main()
{
    dom::cargo<string> text("Hello, World!");

    cout << text << endl;

    return 0;
}

Заголовочный файл для class cargo, включенный в тест:

#ifndef CARGO_H
#define CARGO_H 1

#include "node.h"

#include <iostream>

namespace dom
{
    template <typename Type> class cargo;

    template <typename Type>
    std::ostream& operator<<(std::ostream&, const dom::cargo<Type>&);

    template <typename Type>
    class cargo
        : public dom::node
    {
        Type value;

    public:
        cargo()
            : value()
        { }

        cargo(Type value)
            : value(value)
        { }

        friend std::ostream& operator<< <>(std::ostream&, const dom::cargo<Type>&);
    };
}

#endif // !CARGO_H

И его реализация:

#include "cargo.h"

template <typename Type>
std::ostream& operator<< (std::ostream& ostream, dom::cargo<Type>& cargo)
{
    return (ostream << cargo.value);
}

Я использую CMake для компиляции и связывания всего этого вместе.Полученная ошибка связывания связана с неопределенной ссылкой на operator <<:

Scanning dependencies of target test
[100%] Building CXX object Tests/CMakeFiles/test.dir/test0.c++.o
Linking CXX executable test
CMakeFiles/test.dir/test0.c++.o: In function `main':
test0.c++:(.text+0x9b): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& dom::operator<< <std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::basic_ostream<char, std::char_traits<char> >&, dom::cargo<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)'
collect2: ld returned 1 exit status
make[2]: *** [Tests/test] Error 1
make[1]: *** [Tests/CMakeFiles/test.dir/all] Error 2
make: *** [all] Error 2

Что я делаю не так?Пожалуйста, помогите мне!

1 Ответ

2 голосов
/ 04 ноября 2010

(член) шаблоны функций не являются функциями;компоновщик их не видит, если вы их не создадите.Исходные файлы компилируются отдельно, поэтому, если вы поместите шаблон функции (член) в один исходный файл и не создадите его явно, компоновщик его не увидит.

Так что в вашем случае шаблон функциине был превращен в функцию в cargo.o, поэтому компоновщик сообщает об ошибке, потому что main.o зависит от нее.Вам нужно поместить шаблон в файл заголовка или явно создать его экземпляр в cargo.cpp.

...