【发布时间】:2015-09-17 10:29:38
【问题描述】:
我无法弄清楚模板类和继承的问题。 这是使用的类。
一个带有 typedef 的接口模板类:
template < const unsigned long Number >
class IA
{
protected:
typedef TemplateVector<Item*, Number > List; //template array
public:
virtual List* getList() = 0;
};
具有相同typedef(.hpp)的真实类:
template < unsigned long Number >
class A : public IA< Number >
{
typedef typename IA< Number >::List List;
public:
virtual List* getList();
private:
List* m_list;
};
#include "A.cpp"
具有相同typedef(.cpp)的真实类:
template < unsigned long Number >
TemplateVector<Item*, Number >* A< Number >::getList()
{
return m_list;
}
问题在于getList() 函数的.cpp 定义。
它在编译时会导致错误,我不知道为什么。错误是
declaration is incompatible with "A<Number>::List *A<Number>::getList()
如果我改变:
typedef typename IA< Number >::List List
到
typedef TemplateVector<Item*, Number > List
它工作正常,但它是一个重新定义,我想避免这种警告。 (请注意,我需要分成 .hpp 和 .cpp 文件,并使用完整性编译器)
【问题讨论】:
-
解决此问题的另一种方法是将函数定义 (.cpp) 中的标头更改为
typename A<Number>::List* A< Number >::getList(): coliru.stacked-crooked.com/a/79fbe3febd01232b 。事实上,这似乎是最明智的做法。 -
就这么简单!感谢您的帮助 :) 我之前尝试过没有“typename”的 A
::List* A::getList() 。我是如此接近:) -
typename部分是 gcc 向我建议的,我自己也总是忘记它。但是,这并不能解决您发布的问题;我希望有更多知识的人能解释为什么您的原始代码无法编译。 -
旁注:您在
IA中声明您的类型名称为protected,在A中声明private,除非您公开公开返回这些类型对象的函数。除非用户使用编译时类型推断,否则他们不能使用显式类型变量调用您的函数。要么让你的 typedef 公开,要么让它们受到保护,同时也让函数受到保护。我更喜欢前者,因为在这里向用户公开 typedef 有什么害处? (有关我的意思的更多信息,请参阅this code example