6

(この回答に基づいて)質問への回答を調査するとき、私は次のことを試みました:

template <class T>
class friendly {
    friend class T;
};

friendly<string> howdy;

これは、次のエラーでコンパイルに失敗します:

エラー: テンプレート パラメーター "T" は、複雑な型指定子のフレンド クラス T では使用できません。

親友の Google から理解できることから、これは誤ってインスタンス化を試みないようにするためですがfriendly<int>、テンプレートをコンパイルするときになぜこれがエラーになるのでしょうか? テンプレートを無効なタイプでインスタンス化するときにエラーになるべきではありませんか(私が書いたようなint f() { return T::foo(); }

4

2 に答える 2

3

標準のセクション 7.1.5.3 では、これを不正な詳細型指定子の例として明示的に説明しています。

この件に関する議論はここで見つけることができます。

于 2009-06-17T13:46:32.043 に答える
2

もう少しググると、C++0xの拡張friend宣言 (PDF)が表示されます。

このドキュメントには次の内容が含まれます。

template <typename T> class R {
    friend T;
};
R<C> rc; // class C is a friend of R<C>
R<int> ri; // OK: “friend int;” is ignored

これは、私が思っていたよりもさらに進んでいます (friendインスタンス化中に失敗するのではなく、不正な減速を無視します)。ですから、正当な理由はなく、修正されているというのが答えだと思います。

于 2009-06-18T12:33:15.033 に答える