我有一个这样定义的模板类:
关闭列表.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,我想知道这是否仍然如此。像这样显示的其他网页(抱歉是德语)显示了在类定义之外定义成员的代码。