This is not a compiler error: the error is coming from the linker. After compilation, the linker will merge the object files resulting from the compilation of each of your translation units (.cpp
files).
The linker finds out that you have the same symbol defined multiple times in different translation units, and complains about it (it is a violation of the One Definition Rule).
The reason is most certainly that main.cpp
includes client.cpp
, and both these files are individually processed by the compiler to produce two separate object files. Therefore, all the symbols defined in the client.cpp
translation unit will be defined also in the main.cpp
translation unit. This is one of the reasons why you do not usually #include
.cpp
files.
Put the definition of your class in a separate client.hpp
file which does not contain also the definitions of the member functions of that class; then, let client.cpp
and main.cpp
include that file (I mean #include
). Finally, leave in client.cpp
the definitions of your class’s member functions.
client.h
#ifndef SOCKET_CLIENT_CLASS #define SOCKET_CLIENT_CLASS #ifndef BOOST_ASIO_HPP #include <boost/asio.hpp> #endif class SocketClient // Or whatever the name is... { // ... bool read(int, char*); // Or whatever the name is... // ... }; #endif
client.cpp
#include "Client.h" // ... bool SocketClient::read(int, char*) { // Implementation goes here... } // ... (add the definitions for all other member functions)
main.h
#include <iostream> #include <string> #include <sstream> #include <boost/asio.hpp> #include <boost/thread/thread.hpp> #include "client.h" // ^^ Notice this!
main.cpp
#include "main.h"