0

クラスを親名前空間のテンプレートの友達にするのに苦労しています。誰かが私が間違っていることを説明できますか?

MSVC8(Visual Studio 2005)での私の試みとエラーは次のとおりです。


namespace a {
namespace b {

    template<typename T>
    class x;

    namespace c {

        class y
        {
            template<typename T>
            friend class x;
            ...
        };

    }
}}

エラーC2888::a::b::x名前空間内でシンボルを定義できませんc


namespace a {
namespace b {

    template<typename T>
    class x;

    namespace c {

        class y
        {
            template<typename T>
            friend class ::a::b::x;
            ...
        };

    }
}}

エラーC2888::a::b::x名前空間内でシンボルを定義できませんc


namespace a {
namespace b {

    namespace c {

        class y
        {
            template<typename T>
            friend class ::a::b::x;
            ...
        };

    }
}}

エラーC2039::はのxメンバーではありませんa::b


循環インクルードにつながるclass xことに依存するため、含むヘッダーファイルだけをインクルードすることはできません。class y

4

1 に答える 1

1

ハックの回避策:テンプレートがインスタンス化されるすべての特定のタイプがわかっている場合は、テンプレートではなく、各インスタンス化を友だちにしてください。例えば:

namespace a {
namespace b {

    template<typename T>
    class x;

    namespace c {

        class y
        {
            friend class x<char>;
            friend class x<wchar_t>;
            ...
        };

    }
}}
于 2012-05-22T01:32:58.743 に答える