我正在尝试创建一个带有友元函数的模板类,该函数位于嵌套的命名空间内。如果我删除所有 namespace 或删除所有模板化,它工作正常。但是两者都到位了,它不会编译。让我们看一些代码:
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) 告诉我:
error C2248: 'MyNamespace::Container::value' : cannot access private member declared in class 'MyNamespace::Container'
有人知道我错过了什么吗?
最佳答案
friend
Container
内的声明类模板声明了一个 friend 非模板函数getValue()
住在AccessPrivateImplementation
命名空间。
但是,您还没有提供这样的功能。相反,您在 AccessPrivateImplementation
中拥有的内容命名空间是一个函数模板,您希望对其进行适当的特化friend
的 Container<T>
(对于给定的 T
)。
为此,您需要的声明是:
friend Type AccessPrivateImplementation::getValue<>(Container<Type>* volume);
// ^^
这是一个live example显示您的代码使用上述修复进行编译。
关于c++ - 具有嵌套命名空间内友元函数的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16307836/