Шаблонная функция C ++ компилируется в заголовке, но не в реализации

Я пытаюсь выучить шаблоны и столкнулся с этой ошибкой. Я объявляю некоторые функции в заголовочном файле и хочу создать отдельный файл реализации, в котором будут определены функции. Вот код, который вызывает заголовок (dum.cpp):

#include <iostream>
#include <vector>
#include <string>
#include "dumper2.h"

int main() {
    std::vector<int> v;
    for (int i=0; i<10; i++) {
        v.push_back(i);
    }
    test();
    std::string s = ", ";
    dumpVector(v,s);
}

Теперь вот рабочий заголовочный файл (dumper2.h):

#include <iostream>
#include <string>
#include <vector>

void test();

template <class T> void dumpVector( std::vector<T> v,std::string sep);

template <class T> void dumpVector(std::vector<T> v, std::string sep) {
    typename std::vector<T>::iterator vi;

    vi = v.begin();
    std::cout << *vi;
    vi++;
    for (;vi<v.end();vi++) {
        std::cout << sep << *vi ;
    }
    std::cout << "\n";
    return;
}

С реализацией (dumper2.cpp):

#include <iostream>
#include "dumper2.h"

void test() {
    std::cout << "!olleh dlrow\n";
}

Странная вещь в том, что если я перемещу код, который определяет dumpVector, из .h в файл .cpp, я получу следующую ошибку.

g++ -c dumper2.cpp -Wall -Wno-deprecated
g++ dum.cpp -o dum dumper2.o -Wall -Wno-deprecated
/tmp/ccKD2e3G.o: In function `main':
dum.cpp:(.text+0xce): undefined reference to `void dumpVector<int>(std::vector<int, std::allocator<int> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make: *** [dum] Error 1

Так почему же это работает в одну сторону, а не в другую? Ясно, что компилятор может найтиtest()так почему же он не может найтиdumpVector?

Ответы на вопрос(6)

Ваш ответ на вопрос