1

我有一个 boost socket 实现,它可以在 Windows 和 Linux 上完美运行,但在 mac 上,相同的代码会出现一堆编译错误,例如。

src/modules/socket/ssl_tcp_socket_binding.cpp: In constructor 
'ti::SecureTCPSocket::SecureTCPSocket(tide::Host*, ti::TCPSocketBinding*)':
src/modules/socket/ssl_tcp_socket_binding.cpp:27: error: class 'ti::SecureTCPSocket' does not have any field named 'Socket'
src/modules/socket/ssl_tcp_socket_binding.cpp:29: error: no matching function for call to 'ti::Socket<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&> >::Socket()'

构造函数

SecureTCPSocket::SecureTCPSocket(Host *host, TCPSocketBinding * tcp_socket_binding)
        : Socket(host, string("Socket.SecureTCPSocket")),

标题

class SecureTCPSocket
        : public Socket<boost::asio::ssl::stream<tcp::socket&> >
    {

我不明白为什么这在 Mac 上是个问题,但在 Linux 和 Windows 上却完全没问题?

关于我可能做错或遗漏的任何想法?

4

1 回答 1

2

当你提到一个不同于你当前正在实现的类模板时,你必须指定模板参数。除非是复制粘贴错误,否则需要使用

SecureTCPSocket::SecureTCPSocket(Host *host, TCPSocketBinding * tcp_socket_binding)
    : Socket<boost::asio::ssl::stream<tcp::socket&> >(host,
                                                      string("Socket.SecureTCPSocket")),
      ...

事实上,错误消息表明需要:它声明它不知道什么Socket是并继续声明没有匹配的构造函数用于实例化Socket<boost::asio::ssl::stream<tcp::socket&> >(嗯,它的扩展版本)。

The question in this case actually isn't why the compiler used on Mac (clang?) doesn't compile the code but rather why the compilers used on Windows and Linux do compile the code!

于 2012-11-10T22:38:29.167 回答