我正在尝试使用模板来制作通用接口类型类。因此,我想在模板类中有一个“ connect()”函数。但是,当我为套接字接口实现模板的实现时,编译器认为我的意思是父级的connect()函数,而不是属于socket.h库的一部分的connect()函数。如何在实现类中指定要使用socket.h库的connect()函数?请参阅下面的最小示例
#include <string>
#include <sys/socket.h>
#include <netdb.h>
template <class Input, class Output> class Parent {
public:
Parent() : _isConnected(false) {}
bool connect() {
return _isConnected || (_isConnected = childConnect());
}
private:
bool _isConnected;
virtual bool childConnect() = 0;
};
class Implementation : public Parent<std::string, std::string> {
bool childConnect() {
int sockfd;
struct addrinfo *p;
connect(sockfd, p->ai_addr, p->ai_addrlen);
return true;
}
};
int main() {
Implementation ii;
return 0;
}
和编译器错误
g++ main.cc
main.cc: In member function ‘virtual bool Implementation::childConnect()’:
main.cc:22:46: error: no matching function for call to ‘Implementation::connect(int&, sockaddr*&, socklen_t&)’
connect(sockfd, p->ai_addr, p->ai_addrlen);
^
main.cc:11:8: note: candidate: bool Parent<Input, Output>::connect() [with Input = std::__cxx11::basic_string<char>; Output = std::__cxx11::basic_string<char>]
bool connect() {
^~~~~~~
main.cc:11:8: note: candidate expects 0 arguments, 3 provided
你可以完全限定通话资格:
::connect(sockfd, p->ai_addr, p->ai_addrlen);
我简直不敢这么简单。我以为这是名称空间,但不确定如何解决。