将模板函数声明为友元
Declare a template function as 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<A>(4, 5)
时,它编译失败,错误是foo不能访问A
的私有构造函数。我无法理解这个错误,我如何正确地将foo
声明为A
的朋友?
修复了模板参数和参数包的语法问题后,这似乎可以工作了:
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);
}
下面是上述代码编译的一个实例:
相关文章:
- 如何在嵌套类中正确使用友元声明?
- 类模板中文本运算符的友元声明
- 模板和隐式构造函数的类定义之外的友元声明
- 如何将友元声明用于具有约束的模板类
- 模板化友元声明在 G++ 5.4.0 下不起作用 - 编译器错误或错误代码
- 友元声明阻止外部函数访问类的私有部分
- C++:友元声明'声明一个非模板函数
- 友元声明及其表示的实体
- 嵌套类中需要前向声明的友元声明
- 多参数模板不能很好地处理友元声明
- 友元声明和显式模板实例化声明
- 为什么标准禁止部分专门化的友元声明
- is_constructible和is_destructibble不受友元声明的影响
- Pimpl习语和内部对象协作,无需友元声明
- C++中的友元声明-公共和私有之间的区别
- 单个成员而不是整个类的友元声明
- 关于 C++ 中友元声明的基本内容错误
- 有没有办法避免模板友元声明的外部可见性
- 如何解决c++中友元声明的循环依赖
- 指定默认实参的友元声明必须是定义