类似的问题已经在 SO 上被问过很多次了。
但无论如何...
首先,您犯了一些语法错误。
代替
#ifndef ........
#define .....
template <class typename>
class abcBaseClass:public abcDerivedClass{
public:
typename getvalue(char*);
};
#endif
它应该是这样的。
#ifndef ........
#define .....
template <typename T>
class abcBaseClass:public abcDerivedClass{
public:
T getvalue(char*);
};
// Definition follow in this file!
// For reasons or work-arounds, read below.
#endif
此外,模板声明和定义都应该放在同一个文件中。一个例外是当您将该模板实例化为模板定义所在的源文件中的某种类型时。
像这样的东西。
#include "this_template.h"
template <typename T>
// all sorts of definitions...
// Explicit instantiate this template!!!!
template class abcBaseClass<Your_Type_Goes_Here>;
请注意,这种方法的一个根本缺陷是,您只能在程序的其他任何地方使用您在此源文件中显式实例化的类型。尝试使用其他类型实例化此模板将导致链接器抱怨无法找到匹配的定义。
如果您坚持模板是通用的并且在其他地方定义模板类。您可以将定义放入另一个头文件中,只需将其命名为this_template_impl.h
并包含this_template.h
在this_template_impl.h
然后,在你的源文件中,而不是#include "this_template.h"
,你写#include "this_template_impl.h