如何将成员模板类声明为封闭类的友元
How do I declare a member template class an friend of the enclosing class?
我有一些类
template<typename Fun, typename Arg>
class TestBuilder
{
template<typename Int>
class Helper
{};
};
如何使Helper
成为TestBuilder
的friend
?我试过了:
template<typename Int>
friend class Helper;
但这只会使名称空间范围Helper
类的朋友成为TestBuilder
的朋友
但是Helper
是TestBuilder的嵌套类,不是吗?:)
因此,它可以访问外部类的成员(是的,以及它的私有成员),请查看示例:
#include <iostream>
using namespace std;
template<typename Fun, typename Arg>
class TestBuilder
{
int n;
char c;
public:
template<typename Int>
class Helper
{
public:
void print(TestBuilder& tb) {
std::cout << tb.n << " " << tb.c << std::endl;
}
};
TestBuilder(int n, char c) : n(n), c(c) {}
};
int main() {
TestBuilder<int, int> tb(5, 'p');
TestBuilder<int, int>::Helper<int> h;
h.print(tb);
return 0;
}
将输出:
C02QT2UBFVH6-lm:~ gsamaras$ pico main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
5 p
但是,如果您添加另一个类(不是嵌套类,只是另一个),它将无法访问(当然!)TestBuilder
的私有成员,请参阅:
class alienClass
{
public:
/*
That won't work, you will get:
error: 'n' is a private member of 'TestBuilder<int, int>'
error: 'c' is a private member of 'TestBuilder<int, int>'
*/
void print(TestBuilder<int, int>& tb) {
std::cout << tb.n << " " << tb.c << std::endl;
}
};
相关文章:
- 如何在嵌套类中正确使用友元声明?
- 类模板中文本运算符的友元声明
- 模板和隐式构造函数的类定义之外的友元声明
- 如何将友元声明用于具有约束的模板类
- 模板化友元声明在 G++ 5.4.0 下不起作用 - 编译器错误或错误代码
- 友元声明阻止外部函数访问类的私有部分
- C++:友元声明'声明一个非模板函数
- 友元声明及其表示的实体
- 嵌套类中需要前向声明的友元声明
- 多参数模板不能很好地处理友元声明
- 友元声明和显式模板实例化声明
- 为什么标准禁止部分专门化的友元声明
- is_constructible和is_destructibble不受友元声明的影响
- Pimpl习语和内部对象协作,无需友元声明
- C++中的友元声明-公共和私有之间的区别
- 单个成员而不是整个类的友元声明
- 关于 C++ 中友元声明的基本内容错误
- 有没有办法避免模板友元声明的外部可见性
- 如何解决c++中友元声明的循环依赖
- 指定默认实参的友元声明必须是定义