Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中使用未声明的标识符+;使用模板和继承_C++_Templates_Inheritance - Fatal编程技术网

C++ 在C+中使用未声明的标识符+;使用模板和继承

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

无法编译以下代码-使用未声明的标识符。我使用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>
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您肯定需要查找有关非限定名称的被诅咒的依赖基查找规则。你说的不对。合格的编译器将需要它。