具有友元函数的模板类,该函数位于嵌套命名空间内

时间:2013-04-30 19:47:10

标签: c++ templates namespaces friend

我正在尝试使用友元函数创建一个模板类,该函数位于嵌套命名空间内。如果我删除所有命名空间或删除所有的模板化,它工作正常。但是两者都没有编译。我们来看一些代码:

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'中声明的私有成员

有没有人知道我缺少什么?

2 个答案:

答案 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);
                                                 ^^