我目前在 Foo.h 中定义了两个未命名的类: 这段代码编译得很好,它是这样使用的: 但是,现在我想将成员函数定义移动到源文件中。我知道将此类拆分为头文件和源文件的唯一方法是命名这些类: 福.h: 文件.cpp: 然而,这段代码不是我想要的,因为它很丑,而且我一开始并不想要一个命名 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我正在尝试将C套接字库中的一些函数封装到我自己的C ++类中。 我想定义一个成员函数,它使用与其相应的C函数相同的名称,但具有不同的签名。 例如,我想写这个函数
ssize_t MyClass::write(const void *buf);
打电话给
ssize_t write(int fd, const void *buf, size_t count);
当我编译时,我得到以下错误
error: no matching function for call to ‘MyClass::write(int&, const char*&, size_t)’
note: candidates are: ssize_t MyClass::write(const char*)
我有正确的#include
语句来调用C套接字库,但是我对write函数的定义似乎正在影响它。 如果我将我的类定义函数的名称更改为其他内容,那么一切似乎都能正常工作。
我有理由相信,更改我的函数名称将成为我的最终解决方案,但有人可以告诉我导致此行为的C ++命名规则的名称吗? 我想阅读它,所以我知道我将来在做什么。
您是否尝试过调用C函数来解释它是否存在于全局命名空间中,例如:: write?
这个页面在描述C ++中的名称查找规则方面做得非常好。 基本上,一旦编译器发现write()
是类成员函数,它就不会查找同名的全局函数。 然后报告错误,因为成员函数write()
没有正确的数量和类型的参数。 使用一元范围解析运算符::
强制编译器仅搜索名为write()
函数的全局命名空间,然后成功。
更一般地说,当编译器寻找函数时,它首先查找最近的命名空间,如果找到具有正确名称的命名空间,即使签名不匹配,它也不会再查看。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.