Компиляция C ++ / класса и строковый атрибут: «ожидается») перед «=» токен » - PullRequest
0 голосов
/ 14 декабря 2011

Я пытаюсь скомпилировать класс отправки почты с использованием сокетов

Однако у меня есть эта ошибка во время компиляции:

Ожидается `) 'перед' = 'токеном

В строке, где я объявляю конструктор:

Mail(ipSMTP="serveurmail.com", port=25)

Я подозреваю, что проблема связана с двумя строковыми атрибутами, объявленными до конструктора Mail ():

Вот код файла mail.h, содержащего объявление класса Mail:

#if defined (WIN32)
#include <winsock2.h>
typedef int socklen_t;
#elif defined (linux)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#endif

#include <string>
#include <iostream>


using namespace std;

class Mail
{
  private :

  public :
         SOCKET sock;
         SOCKADDR_IN sin;
         char buffer[255];
         int erreur;
         int port;
         string message;
         string ipSMTP;

          Mail(ipSMTP="serveurmail.com", port=25)
          {
               #if defined (WIN32)
                WSADATA WSAData;
                erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
                 #else
                    erreur = 0;
                 #endif

               message = "";

               /* Création de la socket */
                sock = socket(AF_INET, SOCK_STREAM, 0);

                /* Configuration de la connexion */
                sin.sin_addr.s_addr = inet_addr(ipSMTP.c_str());
                sin.sin_family = AF_INET;
                sin.sin_port = htons(port);
          }

          ~Mail()
          {
               /* On ferme la socket précédemment ouverte */
                    closesocket(sock);

                    #if defined (WIN32)
                        WSACleanup();
                    #endif
          }

          void envoi()
          {
               //Instructions d'envoi d'email par la socket via le SMTP
          } 
};

Ответы [ 4 ]

5 голосов
/ 14 декабря 2011

Вам необходимо указать типы аргументов вашего конструктора, а также присваивать вашим членам переданные значения.

Mail(ipSMTP="serveurmail.com", port=25)
{

должно быть записано как

Mail (string const& ipSMTP = "serveurmail.com", int port =25)
  : port (port), ipSMTP (ipSMTP) // constructor initializer list
{

Выше мы присваиваем переменные-члены, используя список инициализатора конструктора, вы можете узнать больше об этом здесь:

[10.6] Должны ли мои конструкторы использовать «списки инициализации» или «присваивание»?

1 голос
/ 14 декабря 2011
Mail(ipSMTP="serveurmail.com", port=25)

должно быть

Mail( std::string ipSMTP="serveurmail.com", int port=25)

Вы также должны удалить директиву using из заголовочных файлов:

using namespace std;

Это плохая практика, так как оно заполняет глобальное пространство имен содержимым std везде, где вы включаете заголовок.

0 голосов
/ 14 декабря 2011

Параметры имеют тип. Поскольку вы, вероятно, хотите инициализировать переменные-члены, вам нужно что-то вроде

Mail(const string& ipsmtp="serveurmail.com",int p=25) : ipSMTP(ipsmtp), port(p) {
    ...
}
0 голосов
/ 14 декабря 2011

Вам необходимо: (1) указать типы аргументов; (2) инициализировать соответствующие элементы данных:

Mail(std::string ipSMTP="serveurmail.com", int port=25)
: ipSMTP(ipSMTP), port(port)
{
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...