C++ 在C+中使用未声明的标识符+;使用模板和继承
无法编译以下代码-使用未声明的标识符。我使用GCC和XCode进行编译 所有内容都在一个头文件中C++ 在C+中使用未声明的标识符+;使用模板和继承,c++,templates,inheritance,C++,Templates,Inheritance,无法编译以下代码-使用未声明的标识符。我使用GCC和XCode进行编译 所有内容都在一个头文件中 include "MyArray.h" template <typename T> class MyBase { public: MyBase(); virtual ~MyBase(); void addStuff(T* someStuff); protected: MyArray<T*> stuff; }; template <typename T
include "MyArray.h"
template <typename T>
class MyBase {
public:
MyBase();
virtual ~MyBase();
void addStuff(T* someStuff);
protected:
MyArray<T*> stuff;
};
template <typename T>
MyBase<T>::MyBase() {}
template <typename T>
MyBase<T>::~MyBase() {}
template <typename T>
void MyBase<T>::addStuff(T* someStuff) {
stuff.add(someStuff);
}
// ---------------------
template <typename T>
class MyDerived : public MyBase<T> {
public:
MyDerived();
virtual ~MyDerived();
virtual void doSomething();
};
template <typename T>
MyDerived<T>::MyDerived() {}
template <typename T>
MyDerived<T>::~MyDerived() {}
template <typename T>
void MyDerived<T>::doSomething() {
T* thingy = new T();
addStuff(thingy); //here's the compile error. addStuff is not declared.
}
包括“MyArray.h”
模板
类MyBase{
公众:
MyBase();
虚拟~MyBase();
void addStuff(T*sometuff);
受保护的:
我的阵列材料;
};
模板
MyBase::MyBase(){}
模板
MyBase::~MyBase(){}
模板
void MyBase::addStuff(T*someStuff){
添加(something);
}
// ---------------------
模板
类MyDerived:publicmybase{
公众:
MyDerived();
虚拟~MyDerived();
虚空剂量仪();
};
模板
MyDerived::MyDerived(){}
模板
MyDerived::~MyDerived(){}
模板
void MyDerived::doSomething(){
T*thingy=新的T();
addStuff(thingy);//这里是编译错误。addStuff未声明。
}
有人有解释吗?
提前谢谢 试试看
this->addStuff(thingy);
有几个问题:
doSomething
方法声明/定义缺少类型addStuff
方法的定义缺少类型this->
前缀调用addStuff
方法:
this->addStuff(thingy);
这是由于模板继承。在这种情况下,您应该手动指定使用基本方法:
template <typename T>
MyDerived<T>::doSomething() {
using MyBase<T>::addStuff;
T* thingy = new T();
addStuff(thingy);
}
模板
MyDerived::doSomething(){
使用MyBase::addStuff;
T*thingy=新的T();
addStuff(东西);
}
或通过此指针执行此操作:
template <typename T>
MyDerived<T>::doSomething() {
T* thingy = new T();
this->addStuff(thingy);
}
模板
MyDerived::doSomething(){
T*thingy=新的T();
这个->添加东西(东西);
}
使用此指针调用addStuff方法,即
this->addStuff(thingy);
我认为,这不应该成为标准
这个->
部分在这里是必需的。@Nawaz:MSVC2010也可以工作。你能从《标准》上发表一篇引文吗?为什么它不应该起作用?@Nawaz:不,在这种情况下这不是一个要求。有关详细信息,请参阅我对您答案的评论。@JurajBlaho:如果您想了解有关两阶段名称查找的更多信息,请参阅:@mike you's Error。此->前缀是必需的。如果名称是依赖的,则不足以在依赖基类中查找该名称。gcc在其最新版本中修复了此错误。@juanchopanza:事实上,这是正确的,因为编译器不知道它是依赖的。@moo它肯定是依赖的,将在实例化时被查找。@Johanneschaub litb谢谢,我将不得不做一些阅读。我已经设法说服自己,它是对的,它是错的。这对我来说太奇怪了!我也被咬了一口。你有没有链接到解释原因的文档/文章?@GiovanniBotta我发现了一个更好的副本,有更好的答案。请参阅问题标题下的链接。@jua您肯定需要查找有关非限定名称的被诅咒的依赖基查找规则。你说的不对。合格的编译器将需要它。