1

ネストされた名前空間内にあるフレンド関数を使用してテンプレート クラスを作成しようとしています。すべての名前空間を削除するか、すべてのテンプレート化を削除すると、正常に機能します。しかし、両方を配置すると、コンパイルされません。いくつかのコードを見てみましょう:

namespace MyNamespace
{
    // Forward declaration
    template <typename Type>
    class Container;

    // Forward declaration
    namespace AccessPrivateImplementation
    {
        template <typename Type>
        Type getValue(Container<Type>* container);
    }

    // Templatized class
    template <typename Type>
    class Container
    {
        friend Type AccessPrivateImplementation::getValue(Container<Type>* volume);
    private:
        Type value;
    };

    // Friend function inside a namespace
    namespace AccessPrivateImplementation
    {
        template <typename Type>
        Type getValue(Container<Type>* container)
        {
            return container->value;
        }
    }
}

int main(int argc, char* argv[])
{
    MyNamespace::Container<int> cont;
    MyNamespace::AccessPrivateImplementation::getValue(&cont);
    return 0;
}

コンパイラ(VS2010)は私に教えてくれます:

エラー C2248: 'MyNamespace::Container::value': クラス 'MyNamespace::Container' で宣言されたプライベート メンバーにアクセスできません

誰かが私が見逃しているものを知っていますか?

4

2 に答える 2