0

私はこのようなものを持っています:

class Container1 {
  public:
    method1() { ... }
}
class Container2 {
  public:
    method1() { ... }
}

template<class C = Container1>
class X : public C {
  public:
    using C::method1();
    .....
    X(string& str) : C(str) {};
    X& other_method() { method1(); ...; }
}

私の質問は、メソッドにアクセスできるようにするために「using C::method1()」を使用する必要がある理由です..私が見つけた答えのほとんどは、テンプレートクラスがテンプレートクラスを継承している場合です。通常、"this->" の使用について言及されていますが、この場合はうまくいかないようです。もう少し短くできるかな…

また、私が得ている他のエラーは同じ問題に関連していると思われます:

no match call for (X<Container1>) (<std::string&>)
4

2 に答える 2

1

とはプライベートであるため、呼び出しthis->method1()はおそらく失敗します。これを修正するには、次のようにします。Container1::method1Container2::method1

class Container1 {
public:
    void method1() { ... }
};

次に、「なぜテンプレート基本クラスで定義されたメソッドを使用する必要があるのか​​、usingまたは呼び出すときに」に戻ると、テンプレート引数に依存するため、ここに依存名があるthis->という答えが返ってきます。したがって、コンパイラに「ねえ、この呼び出しが表示されますか?まあ、そのシンボルは、継承しているテンプレートクラスで定義する必要があります」と伝える必要があります。method1Cmethod1

クラステンプレートを実際にインスタンス化するまで、コンパイラは継承しているものを認識しないため、メンバー関数をそのテンプレートパラメータで定義する必要があることを示す必要があります。そうしないと、クラスに「method1」という名前のメソッドが見つからないため、コンパイラーは非修飾関数の呼び出しを認識し、エラーを生成しますX

このスレッドには、依存する名前についての情報が含まれています。

コードのもう1つのエラーは、コンストラクターです。

X<C>(string& str) : ...

そのコードは不正な形式です。クラスXのコンストラクターコンストラクターは、次のように定義する必要があります。

X(string& str) : ....
于 2012-09-08T02:57:16.057 に答える
1

まず第一に、 ctor の定義では を使用すべきではありません<C>。ほとんどの場合、これはコンパイラを混乱させます。

template<class C = Container1>
class X : public C 
{
    X(string& str) : C(str) { }
    X& other_method() { method1(); ...; }
}

その他のポイントは、コンパイラが何を呼び出すべきかわからない可能性があることです:base_class::method1()またはtemplate_param::method1(). 実際にはこれは同じことですが、コンパイラはこれを理解するのに問題があるかもしれません。ここで異なるコンパイラが異なる動作をしても、私は驚かないでしょう。

これらは、テストを実行していない私の 2 セントです。

于 2012-09-08T02:52:13.317 に答える