2015-04-04 3 views
0

У меня есть C++, используя класс, указанный в отдельных файлах .hpp/.cpp. Этот класс имеет особенность иметь шаблонную функцию-член, которая принимает аргумент const std::vector, и вот корень проблемы.Невозможно скомпилировать/связать класс с шаблоном членом из отдельного .cpp

myclass.hpp:

class myclass { 

    //... 
    public: 
     myclass(); 
     template <typename _t> int myfunction(const std::vector<_t> *values); 

    //... 
} 

myclass.cpp:

#include "myclass.hpp" 

//... 
template <typename _t> int myclass::myfunction(const std::vector<_t> *values){ 
    // do stuff 
    return 0; 
} 

и мой main.cpp:

#include "myclass.hpp" 

int main(int argc, char const *argv[]){ 

    myclass foo; 
    std::vector<int> bar(5,100); 
    foo.myfunction(bar); 

    return 0; 
} 

Однако, когда я пытаюсь скомпилировать все это с g++ main.cpp myclass.cpp -o main -I /usr/include я получаю ошибку:

undefined reference to `int myclass::myfunction<int>(std::vector<int, std::allocator<int> > const*)' 

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

ответ

1

Функции шаблона должны быть размещены в заголовках, а не в источниках. Это потому, что шаблон - это в основном инструкция для компилятора, которая говорит ему, как сгенерировать код для некоторого набора параметров шаблона. Это не само определение. Поэтому шаблон «тело» должен быть доступен при создании конкретной специализации.

прямолинейно говоря, этот код:

template <typename _t> int myclass::myfunction(const std::vector<_t> *values){ 
    // do stuff 
    return 0; 
} 

должен быть помещен в .hpp, не .cpp файла.

Вы также можете прочитать этот вопрос: link.

Смежные вопросы