我想为Linux Socket API编写一个C ++包装器。我的包装器的方法应该与API的基础函数名称相同。
但是例如在bind()方法中,我使用Linux套接字API中的普通C bind()函数。我调用bind(mSocketDescriptor, (struct sockaddr *) &serv_addr, sizeof(serv_addr))
,它与API函数的签名兼容。我的编译器抱怨Invalid arguments 'Candidates are: bool bind(int)'
这是指我的方法inline bool Socket::bind(int portno)
。
为什么Eclipse引用了包装器函数?如何禁止Eclipse执行此操作?
答案 0 :(得分:2)
您必须添加全局范围限定符:
::bind(mSocketDescriptor, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
范围解析确定编译器查找名称的位置。您可以在名称前加上名称空间和/或类范围(例如socket_wrapper::socket::bind()
)。并且存在全球范围,系统功能通常存在于其中。这些函数可以使用全局范围限定符::bind()
作为前缀,因此编译器知道不使用具有相同名称的本地方法。
还有std
命名空间,标准库的类和函数位于该命名空间中。如果您想使用标准库,请在std::
之前为这些名称添加前缀(例如std::iostream, std::cout, std::string, std::vector<>, ...
)。
答案 1 :(得分:0)
请使用名称空间。 明确地!
此外,C调用应该在您的情况下使用:: prefix :: bind引用