2012-11-10 26 views
1

我有一個boost套接字實現,它可以在Windows上運行完美,但在Mac上,相同的代碼會得到一堆編譯錯誤,比如。Mac不能編譯,Windows和Linux會 - 提升ASIO?

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 &完全正常?

任何想法,我可能做錯了或失蹤?

回答

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&> >(以及它的更多擴展版本)。

這種情況下的問題實際上並不是爲什麼在Mac上使用的編譯器(clang?)沒有編譯代碼,而是爲什麼在Windows和Linux上使用的編譯器會編譯代碼!

+0

如果我這樣做,我會抱怨一個巨大的錯誤'注意:缺少的vtable通常意味着第一個非內聯虛擬成員函數沒有定義。 ld:符號(s)未找到建築i386',這使得更少的意義,那麼這個錯誤+ _ + – Steven

+0

@Steven:我會說這個錯誤是非常有意義的,並可能指向另一個問題,其他編譯器更馬虎!這次它指出需要定義的函數(例如,模板實例化)不會被實例化。這也意味着編譯時錯誤確實已解決,但鏈接失敗。至少,這是進步! –