2013-05-02 2 views
0

У меня есть класс, определяемый следующим образом:компоновщика ошибка: символы Л.Д. не найдены

// grid_search.h 
template<typename Element, typename Solution, typename Oracle> 
class grid_search : public OptimizerInterface<Element, Solution, Oracle> { 
private: 
    // ... 
public: 
    virtual Solution search(const SpaceInterface<Element>& space, Oracle oracle); 
}; 

и я реализую его в grid_search.cc. Теперь я использую это так:

// needed extra definitions 
typedef double (*oracle_f)(vector<int>&); 
class TestSpace : public SpaceInterface<int> { /* ... */ } 
static double f(vector<int>& x) { return 0.0; } // what ever f 

// setup a search space and run the grid search 
TestSpace space(/* ... */); 
GridSearch<int, vector<int>, oracle_f> *optimizer = new GridSearch<int, vector<int>, oracle_f>(); 
optimizer->search(space, f); 

Тогда ошибка линкера (обратите внимание, что все компилируется и grid_search.cc найден штраф):

Undefined symbols for architecture x86_64: 
"GridSearch<int, std::vector<int, std::allocator<int> >, double (*)(std::vector<int, std::allocator<int> >&)>::search(SpaceInterface<int> const&, double (*)(std::vector<int, std::allocator<int> >&))", referenced from: 
    vtable for GridSearch<int, std::vector<int, std::allocator<int> >, double (*)(std::vector<int, std::allocator<int> >&)> in grid_search.cc.o 

Я просмотрел его несколько раз, но может» t выяснить, какой корень этой ошибки ...

+0

'поиск' не реализован. Или реализация не видна. –

+1

Вы произвольно помещаете реализацию в файл .cpp? – juanchopanza

+1

Возможный дубликат [Почему шаблоны могут быть реализованы только в файле заголовка?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) –

ответ

1

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

+0

Действительно, это время от времени укусит меня :) sry. –

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