我正在尝试使用友元函数创建一个模板类,该函数位于嵌套命名空间内。如果我删除所有命名空间或删除所有的模板化,它工作正常。但是两者都没有编译。我们来看一些代码:
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'中声明的私有成员
有没有人知道我缺少什么?
答案 0 :(得分:1)
friend
类模板中的Container
声明声明了位于getValue()
命名空间中的朋友非模板函数AccessPrivateImplementation
。< / p>
但是,您还没有提供这样的功能。相反,您在AccessPrivateImplementation
命名空间中拥有的是一个函数模板,您需要friend
Container<T>
的适当特化(对于给定的{{1} }})。
为实现这一目标,您需要的声明是:
T
以下是live example,其中显示了使用上述修补程序编译的代码。
答案 1 :(得分:1)
根据我的评论,如果您宣布friend
,那么它将起作用:
friend Type AccessPrivateImplementation::getValue<>(Container<Type>* volume);
^^