提问者:小点点

将模板函数声明为friend


我有一个全局函数是这样的:

namespace X
{
namespace Y
{
template <R, ...T>
R foo(T&&... args)
{
    R r(args...);
    return r;
}
}
}

然后在另一个类A中,我要将这个函数foo声明为A的朋友。所以我做了:

class A
{
template <R, ...T>
friend R X::Y::foo(T&&... args);
A(int x, int y){}
};

现在,当我调用x::y::foo(4,5)时,它无法编译,错误是foo无法访问a的私有构造函数。我无法理解该错误,如何正确声明fooa的朋友?

提前道谢。


共1个答案

匿名用户

在修复了模板参数和参数包的语法问题之后,这似乎起作用了:

namespace X
{
    namespace Y
    {
        template <typename R, typename ...T>
        R foo(T&&... args)
        {
            R r(args...);
            return r;
        }
    }
}

class A
{
    template <typename R, typename ...T>
    friend R X::Y::foo(T&&... args);
    A(int x, int y){}
};

int main()
{
    X::Y::foo<A>(1, 2);
}

这里是上述代码编译的一个实例。