gpt4 book ai didi

c++ - 友元函数必须在同一个文件中吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:49 26 4
gpt4 key购买 nike

我实际上正在测试一个文件,我有一种情况,我需要从 main.cpp 访问该类的一些 protected 成员。我尝试将 main() 添加为 friend ,但没有成功,了解到它不会工作,所以我将 main() 中的所有内容移动到 test () 并使 test() 成为好友。仍然显示错误。

例子是

 //--File.hpp

namespace Files {

class File {
public:
File(long word_):word(word_) {}
protected:
long word;
private:
friend int test();
};
}//ns:Files


//--List_File.hpp

namespace Files {
class List_File :public File {
public:
List_File() : File(sizeof(int) + sizeof(long)) {}
private:
friend int test();
};
}//ns:Files



//--main.cpp

using namespace Files;

int test() {

File *pd = new List_File();
assert(pd->word == 12); //LINE 34
return 0;
}

int main() {
test();
return 0;
}

//第 34 行出错:Base::value is protected。请指教。

    g++ -O -Wall -Wno-unused -o a.out File.cpp List_File.cpp Data_File.cpp               
Free_List_File.cpp main.cpp
File.hpp: In function ‘int test()’:
File.hpp:30:7: error: ‘long int Files::File::word’ is protected
main.cpp:34:16: error: within this context
make: *** [a.out] Error 1

最佳答案

不,它绝对不必在同一个文件中,但它显然必须“知道”类是什么,即:具有类定义的 header 应该包含在函数所在的文件中实现的。如评论所述,您的代码应该没问题。

添加一些上下文之后

您的test 函数不在Files 命名空间中。如果您希望它位于全局上下文中,则应将其视为命名空间中的“::test”,否则编译器可能期望“Files::test” "成为友元函数,而不是你的情况下的 "::test"。找不到正式的标准引用,但我很确定情况就是这样。请注意,您在这里执行的是前向声明,因此没有默认回退到名称解析的上层范围。

关于c++ - 友元函数必须在同一个文件中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10067734/

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