2017-05-17 50 views
-1

我主要的代碼看起來像這樣:「[類別]不名執行文件類型錯誤

#include "ClientSocket.h" 
#include "SocketException.h" 
#include <iostream> 
#include <string> 

int main (int argc, char argv[]) 
{ 
    std::cout << "" << std::endl; 
    try 
    { 
     ClientSocket client_socket ("localhost", 30000); 
     std::string reply; 

     try 
     { 
      client_socket << "Test message."; 
      client_socket >> reply; 
     } 
     catch (SocketException&) {} 

     std::cout << "We received this response from the server:\n\"" << reply << "\"\n";; 
    } 
    catch (SocketException& e) 
    { 
     std::cout << "Exception was caught:" << e.description() << "\n"; 
    } 

    return 0; 
} 

頭文件看起來像這樣:

// Definition of the ClientSocket class 

#include "ClientSocket.cpp" 
#include "Socket.h" 
#ifndef _CLIENTSOCKET_H 
#define _CLIENTSOCKET_H 

class ClientSocket : private Socket 
{ 
    public: 
     ClientSocket (std::string host, int port); 
     virtual ~ClientSocket(){}; 
     const ClientSocket& operator << (const std::string&) const; 
     const ClientSocket& operator >> (std::string&) const; 
}; 

#endif 

和實施文件看起來像這樣:

// Implementation of the ClientSocket class 

#include "Socket.h" 
#include "SocketException.h" 

ClientSocket::ClientSocket (std::string host, int port) 
{ 
    if (! Socket::create()) 
    { 
     throw SocketException ("Could not create client socket."); 
    } 

    if (! Socket::connect (host, port)) 
    { 
     throw SocketException ("Could not bind to port."); 
    } 
} 

const ClientSocket& ClientSocket::operator << (const std::string& s) const 
{ 
    if (! Socket::send (s)) 
    { 
     throw SocketException ("Could not write to socket."); 
    } 

    return *this; 
} 

const ClientSocket& ClientSocket::operator >> (std::string& s) const 
{ 
    if (! Socket::recv (s)) 
    { 
     throw SocketException ("Could not read from socket."); 
    } 

    return *this; 
} 

我發現,編譯這些文件會導致編譯錯誤的木筏在implemen特別是,無論我使用的包含和警衛的組合如何。

In file included from ClientSocket.h:3:0, 
       from simple_client_main.cpp:1: 
ClientSocket.cpp:6:1: error: 'ClientSocket' does not name a type 
ClientSocket::ClientSocket (std::string host, int port) 
^ 
ClientSocket.cpp:19:7: error: 'ClientSocket' does not name a type 
const ClientSocket& ClientSocket::operator << (const std::string& s) const 
    ^
ClientSocket.cpp:29:7: error: 'ClientSocket' does not name a type 
const ClientSocket& ClientSocket::operator >> (std::string& s) const 
    ^

張貼的東西似乎是最有意義的。我試過在實現文件中包含頭文件,它什麼都不做。我試過從頭文件中刪除包含,並在實現文件中包含頭文件,但是這會用未定義的引用錯誤替換'不命名類型'錯誤。代碼中是否存在阻止編譯的內容?

+2

永遠不要包含cpp文件。 –

+2

永遠不要在這種形式下使用頭文件'_CLIENTSOCKET_H' - 只需使用'CLIENTSOCKET_H'。並將標題文件中的標頭守衛放在_everything_附近。 –

+1

以下劃線後跟大寫字母開頭的名稱將保留用於實施。 *永遠不要*在你自己的代碼中使用這樣的名字(甚至不用於頭部守衛)。 –

回答

0

你不應該試圖包括我認爲ClientSocket.hClientSocket.cpp。請注意,'include'僅僅是一個測試替換,在這種情況下,在定義類本身之前,您正在有效地替換ClientSocket.cpp的內容(包括未聲明的ClientSocket類的方法定義)。

此外,ClientSocket.cpp不包括ClientSocket.h,因此或者不訪問ClientSocket類定義在所有,或經由其它標題有它,後者的情況下被高度氣餒。

1

頭文件看起來像這樣:

// Definition of the ClientSocket class 

#include "ClientSocket.cpp" <== this definitely looks wrong. 

通常不包括cpp文件。這是其他方式,你ClientSocket.cpp應該包括你的ClientSocket.h

// Implementation of the ClientSocket class 
#include "ClientSocket.h" 
#include "SocketException.h" 

ClientSocket::ClientSocket(std::string host, int port) 
{ 
    ... 

頁眉後衛_CLIENTSOCKET_H在ClientSocket.h應該來你有Socket.h之前,也不要使用與一個或兩個下劃線開頭的名稱(它們是保留的標識符):

#ifndef CLIENTSOCKET_H 
#define CLIENTSOCKET_H 

#include "Socket.h" 

class ClientSocket : private Socket 
{ 
    ... 
}; 

#endif /* CLIENTSOCKET_H */ 

ClientSocket.h引用std::string,也許這是包括來自Socket.h。如果沒有,你應該包括它ClientSocket.h

+0

我可能不清楚,但在.cpp simple中包含.h時,會在編譯主代碼時給出未定義的引用錯誤。 – user3564783

+0

@ user3564783你能用這個錯誤信息更新你的問題嗎? – Pavel

+0

@ user3564783您的意思是未定義的鏈接器引用?您還必須單獨編譯您的ClientSocket.cpp,並鏈接生成的ClientSocket.o – Pavel