0

我有一个这样定义的模板类:

关闭列表.h

template <typename T>
class ClosedList
{
public:
    // …

    bool isEmpty () const { return (size() == 0); }

    T first () const;
    T pop_first ();

    void push_back (const T &value);
    ClosedList& operator << (const T &value) { push_back(value); return *this; }

    int size () const { return _size; }

private:
    // …
};

然后,我在另一个文件中定义了函数,如下所示:

关闭列表.cpp

#include "closedlist.h"

template <typename T>
T ClosedList<T>::first () const
{
    // …
    T elem;
    // …
    return elem;
}

template <typename T>
T ClosedList<T>::pop_first ()
{
    // …
    T elem;
    // …
    return elem;
}

template <typename T>
void ClosedList<T>::push_back (const T &value)
{
    // …
}

如果我更改方法实现,例如添加或删除它const后面的,g++ 会向我显示该方法与任何原型都不匹配的错误。所以我猜 g++ 找到了正确的函数原型。但我得到这些错误:

obj/someclass.o: In function `SomeClass::doSomething()':
src/someclass.cpp:231: undefined reference to `ClosedList<Solution>::pop_first()'
src/someclass.cpp:326: undefined reference to `ClosedList<Solution>::push_back(Solution const&)'
obj/someclass.o: In function `ClosedList<Solution>::operator<<(Solution const&)':
include/closedlist.h:69: undefined reference to `ClosedList<Solution>::push_back(Solution const&)'

注意:我看了为什么模板只能在头文件中实现?但由于问题是从 2009 年开始的,而且我使用的是 C++11,我想知道这是否仍然如此。像这样显示的其他网页(抱歉是德语)显示了在类定义之外定义成员的代码。

4

0 回答 0