gpt4 book ai didi

c++ - 如何将成员模板类声明为封闭类的友元?

转载 作者:行者123 更新时间:2023-11-30 02:30:25 25 4
gpt4 key购买 nike

我有课

template<typename Fun, typename Arg>
class TestBuilder
{
template<typename Int>
class Helper
{};
};

如何让 Helper 成为 TestBuilder friend ?我试过:

template<typename Int>
friend class Helper;

但这只会让命名空间范围的 friend 成为 Helper 类的 friend TestBuilder

最佳答案

但是 Helper 是 TestBuilder 的一个嵌套类,不是吗? :)

因此,它可以访问外部类的成员(是的,以及它的私有(private)成员),检查示例:

#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 的私有(private)成员,请自行查看:

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;
}
};

关于c++ - 如何将成员模板类声明为封闭类的友元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38624087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com