6

異なる名前空間で定義された 2 つのクラスがあります。

//--==file1.hpp==--
namespace n1{
class x1 {
//.....
};
};
//--==file2.hpp==--
namespace n2{
class x1: public n1::x1{
//.....
    };
};

//--== file3.hpp ==--
namespace n2 {
 class x2 {
    private:
      n1::x1* data1_;
    public:
      void func(x1* data2) { data1_ = data2; }
  };
};

これのコンパイルは失敗します

error C2440: '=' : cannot convert from `'n2::x1 *' to 'n1::x1 *'`

n2:x1 は n1::x1 を継承しているため、何が問題なのか理解できません...? ありがとうございました

4

2 に答える 2

3

ある名前空間から別の名前空間クラスへの継承では、コンパイル エラーは発生しません。サブクラスで、(別の名前空間にある) 親クラスのメソッドを呼び出す必要がある場合は、完全な名前 (名前空間を使用) を使用する必要があります。

参考までに:

namespace a
{
class A1 {
 public:
    void testA1() {...}
};
}

namespace b
{
class B1: public class a::A1
{
 public:
    void testB1()
        {
          a::A1::testA1();
          ...
        }
};
}

しかし、上記の問題はタイプミスの問題であり、解決されたようです。ただし、使用法を明確にするために、サンプル コードが役立ちます。

于 2018-01-16T15:06:58.927 に答える
-1

file2.hの場合:file1.hをインクルードします

file3.hの場合:file1.hとfile2.hを含めます。

そして主にfile3.hを含めます。

int main(){

n2::x2 xx22;
n2::x1* xx11;
xx22.func(xx11);

}

これは問題なく準拠しています。

于 2012-04-29T12:15:58.193 に答える