0

だから私はいくつかの簡単な質問/構造を持っています:

 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:エラーが実際にここでのみ発音されていることに気付きました(コードへのリンクはこちら):

#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() {}

どうやら私はテンプレートで何かを台無しにしています。最初に書いてなくてすみません。

4

2 に答える 2

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";
 //  ^^^^^^^^^^^^^
 };

それ以外の場合、コンパイラは名前検索の最初のフェーズでnameグローバル名前空間を検索し、見つからない場合はエラーを発行します。

于 2013-03-30T12:56:39.223 に答える
0

セミコロンの欠落はさておき、コードは問題ありません。

唯一の可能な説明は、コンパイラから見たように、実際にはメンバーClass1を持たないということです。nameという名前のクラスが複数ありますClass1か? Class1が宣言されているヘッダー ファイルの複数のコピーがありますか? コンパイラを実行する前にファイルを保存するのを忘れた可能性はありますか?

于 2013-03-30T11:11:39.887 に答える