1

私はウェブを検索しましたが、次のことが起こる理由の説明が見つかりませんでした。

たとえば、ネストされたクラス Nested を含むテンプレート クラス Enclosing があります。

囲みクラスには、ネストされたクラスのインスタンスを作成し、そのフィールドとメソッドを使用するメソッドがあります。

次のコードには、私がそれをやろうとしている方法のモデルがあります:

template<typename T, typename S>
class Enclosing{
public:
    class Nested;
    Nested foo();
};

template<typename T, typename S>
class Enclosing<T,S>::Nested{
public:
    T field;
    void some_method();
    friend class Enclosing;    // instead of this line I also tried:
                               // friend class Enclosing<T,S> 
                               // and it didn't work either
};

template<typename T, typename S>
typename Enclosing<T,S>::Nested Enclosing<T,S>::foo (){
    Nested nes;
    nes.some_method;         // the problem appears here
    return enc;
}

問題は:

私が書いているときnes.some_method、私が試した環境(VS2010、Eclipse)のどれも、「nes.」と入力した後、オプションを提案しません。「nes」はクラスのインスタンスではないようです。

囲んでいるテンプレート クラスからネストされたクラスのメソッドとフィールドにアクセスする方法は?

4

2 に答える 2

5

この行:

Nested nes();

タイプ のオブジェクトを作成するのではnesなく、引数を取らず、タイプ のオブジェクトを返す関数を宣言しNestedます。friend宣言ではなく、これが問題の原因であると思われます。の後の括弧のペアを削除するだけnesです:

Nested nes;

別の方法として、C++11 では次のようにすることもできます。

Nested nes{};

編集:

上記のエラーを修正した後も、プログラムが正しくコンパイルおよびリンクされていないようです - おそらく同じ問題が原因です。コードからわかることは、some_method()メンバー関数の定義がまだ欠落していることです。これが、リンカーがプログラムの実行可能ファイルの作成を拒否する理由である可能性があります。

于 2013-05-10T15:38:35.177 に答える
0

ここ:

Nested nes();

デフォルトのコンストラクターを呼び出すのではなく、 0 引数を取り、クラスのインスタンスを値で返すNestedという名前の関数を宣言します。これは、Most Vexing Parseと呼ばれます。パラメータを削除して、コードが正しく機能するようにします。nesNested

これが実際のデモです。

于 2013-05-10T15:41:28.193 に答える