从C ++中的模板类派生非模板类时出现问题

时间:2013-07-05 21:57:03

标签: c++ inheritance sfml template-classes g++-4.7

我正在尝试从指定了我需要的巫婆类型的模板类继承非模板类​​

我的代码是这样的:

基类的头文件(已更新):

//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”指向使用SFML库的namespac。我正在使用从源代码使用cmake

编译的SFML 2.0

(有关详细信息,请参阅: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 ++ 11的C ++编译器。

1 个答案:

答案 0 :(得分:1)

如果希望编译器隐式实例化模板(99.9%的情况下),编译器必须看到成员的定义。将Base构造函数的定义移到标题中,这应该可以解决您的问题。