Проблемы при получении не шаблонного класса из шаблонного класса в C++

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

Мой код такой:

файл заголовка для базового класса (обновлен):

//base.hpp
template<typename T>
class Base {
public:
    Base(T a,int b) :
            aa(b) {
        this->bb = a;
        // ... some code
    }
    // .. some functions ( all are NOT virtual )
protected:
    const int aa;
    T bb;
    // .. some non-constant variables
}

Заголовок и код для производного класса:

//derived.hpp
#include <SFML/System.hpp>
#iclude "base.hpp"

class Derived: public Base<sf::Vector2i> {
public:
    Derived(float, int, Vector2i);
    // .. other methods
protected:
    // .. other variables
}

//derived.cpp
#include "derived.hpp"

Derived::Derived(float initf, int myint, Vector2i vec) :
        Base(vec, myint) {
    // ... some codes
}

"sf" ссылается на namespac для работы с библиотекой SFML. Я использую SFML 2.0, который скомпилирован из исходного кода с использованием cmake

(для получения дополнительной информации вы можете увидеть: http://www.sfml-dev.org/)

Когда я пытаюсь скомпилировать эти коды с помощью команды, подобной этой:

$ g++ ./main.cpp ./derived.cpp ./base.cpp -lsfml-system

Я получаю ошибку компоновщика, которая говорит:

In function `Derived::Derived(float, int, sf::Vector2<int>)':
undefined reference to `Base<sf::Vector2<int> >::Base(sf::Vector2<int>, int)'

Также я использую "g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3" в качестве моего компилятора C++ с включенным C++11.

1 ответ

Если вы хотите, чтобы компилятор неявно создавал экземпляры ваших шаблонов (в 99,9% случаев, которые вы хотите), компилятор должен видеть определения членов. Переместить определение Base Конструктор к заголовку, и это должно решить вашу проблему.

Другие вопросы по тегам