Sie sollen natürlich keine sein, aber wenn du den Code unverändert aus einer Funktion in eine Klassendefinition verschiebst, dann wird daraus eine Methode.
Dieselbe Zeile Code
tcp::socket socket(io_service);
bewirkt innerhalb einer Funktion die Deklaration eines socket-Objekts, an dessen Konstruktor das io_service-Objekt übergeben wird.
Wenn dieser Code aber in einer Klassendefinion steht, deklariert er eine Methode namens socket (!), die einen (namenlosen) io_service-Parameter hat und ein tcp::socket-Objekt zurückgibt.
Erschwerend (bezüglich des Verständnisses) kommt hier hinzu, dass du konsequent die Objekte genauso genannt hast wie die Klassen.
Wenn das ein Objekt sein soll, dann muss die Initialisierung aus der Klassendefinition raus und in die Initialisierungsliste des Konstruktors.
class create_serv_com : public tcp::acceptor
{
public:
//...
tcp::acceptor acceptor;
tcp::socket socket;
//...[/code]
[code]create_serv_com::create_serv_com() :
acceptor( io_service, tcp::endpoint(tcp::v4() , 13 )),
socket(io_service)
{
// ...
Und wie bereits gesagt, entweder ein acceptor-Member oder eine Vererbung. Beides gleichzeitig ist mit hoher Wahrscheinlichkeit Blödsinn.
Außerdem rate ich dir dringend, die Variablen anders zu benennen. Die Fehlersuche wird nur unnötig schwerer, wenn ein Bezeichner sowohl ein Objekt als auch ein Typ sein kann.