从子构造函数访问父成员(模板)

时间:2013-03-30 11:09:16

标签: c++ oop templates

所以我有一些简单的问题/结构:

 class Class1 {
   public:
      Class1() {};
      ~Class1() {};
   protected:
      std::string name;
 }

 class Class2 : public Class1
 {
   public:
     Class2() : number(id_generator++) {
       name = "My-name"; // (1) want to access field inherited from Parent
   };

   private:
      const unsigned int number;
      static unsigned int id_generator;
  }

编译器抱怨(1):'name' was not declared in this scope。怎么了?它看起来很简单但我看不到它。

EDIT1:我刚才意识到错误实际上只是在这里发音(here链接到代码):

#include <string>

template<int dim>
class Class1 {
   public:
      Class1() {};
     ~Class1() {};
   protected:
      std::string name;
 };

template<int dim>
class Class2 : public Class1<dim>
{
   public:
     Class2() : number(id_generator++) {
       name = "My-name"; // (1) want to access field inherited from Parent
     };

   private:
     const unsigned int number;
     static unsigned int id_generator;
};

int main() {}
显然我用模板弄乱了一些东西。对不起,因为没有把它写在第一位。

2 个答案:

答案 0 :(得分:2)

在模板中,对于引用从基类继承的成员的非限定名称,您应该通过解除引用this来使用显式语法:

 Class2() : number(id_generator++) {
     this->name = "My-name"; // (1) want to access field inherited from Parent
 //  ^^^^^^
 };

或者,或者,您可以通过这种方式限定名称:

 Class2() : number(id_generator++) {
     Class1<dim>::name = "My-name";
 //  ^^^^^^^^^^^^^
 };

否则,编译器将在first phase of name lookup期间在全局命名空间中查找name,如果未找到,则会发出错误。

答案 1 :(得分:0)

除了分号外,代码很好。

唯一可能的解释是编译器看到Class1实际上没有name成员。你有多个名为Class1的班级吗?您是否拥有声明Class1的头文件的多个副本?您是否有可能在运行编译器之前忘记保存文件?