0

以下是文件的内容。首先是模板类:在 .h 文件中:

template <class T>
class templatedClass
{
    public :

    templatedClass(T val);
    ~templatedClass() {}

    void writeV();

    T v;
};

在 .cpp 文件中:

template <class T>
templatedClass<T>::templatedClass(T val)
{
    v = val;
}

template <class T>
void templatedClass<T>::writeV()
{
    std::cout << v << std::endl;
}

构建时一切都很好。

现在继承的类:在.h文件中:

class inheritedClass : public templatedClass<float>
{
    public :

    inheritedClass(float val);
    ~inheritedClass() {}

    void write();
};

在 .cpp 文件中:

inheritedClass::inheritedClass(float val)
: templatedClass<float>(val)
{

}

void inheritedClass::write()
{
    writeV();
}

构建时,我收到以下链接错误:

Undefined symbols for architecture x86_64:
  "templatedClass<float>::writeV()", referenced from:
      inheritedClass::write() in inheritedClass.o
  "templatedClass<float>::templatedClass(float)", referenced from:
      inheritedClass::inheritedClass(float) in inheritedClass.o

我的代码有什么问题?我必须在 XCode 中使用特殊的构建选项才能成功吗?

谢谢您的回答。

4

1 回答 1

0

您有一个缺少模板类实例化的问题。要解决它,您应该将模板实现代码放在头文件中。我的意思是,这部分:

template <class T>
templatedClass<T>::templatedClass(T val)
{
    v = val;
}

template <class T>
void templatedClass<T>::writeV()
{
    std::cout << v << std::endl;
}

还有其他选项,例如保留一个单独的模板实现文件并将其包含在另一个 cpp 文件中,或者在其他地方完全实例化类模板......

请参阅为什么模板只能在头文件中实现?类模板实例化以获取更多详细信息。

于 2014-02-17T17:53:27.963 回答