ネストされた名前空間内にあるフレンド関数を使用してテンプレート クラスを作成しようとしています。すべての名前空間を削除するか、すべてのテンプレート化を削除すると、正常に機能します。しかし、両方を配置すると、コンパイルされません。いくつかのコードを見てみましょう:
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' で宣言されたプライベート メンバーにアクセスできません
誰かが私が見逃しているものを知っていますか?