Unqualified-id перед строковой константой - PullRequest
1 голос
/ 05 мая 2011

При компиляции следующего кода я получаю сообщение об ошибке «ожидаемый безусловный идентификатор перед строковой константой»

In file "Notification_Constants.h"

namespace NOTIFICATION_CONSTANTS
{
    #define SERVICE_EMAIL "service@company.com"
}

В файле SendEmail.cpp

#include "Notification_Constants.h"

void UserPreferences::get_senders_email(String &_email)
{
    _email = NOTIFICATION_CONSTANTS::SERVICE_EMAIL;
}

Если я назначаю как следует, он работает правильно, в чем причина ошибки компиляции.

_email = SERVICE_EMAIL;

Существует аналогичный вопрос , но причина не указана.

Объявление класса String с соответствующими методами

class String
{
public:

String();
String(const String& src);
String(const char *new_str);
String& operator=(const String& src);
String& operator=(const char *new_str);
};

Ответы [ 4 ]

8 голосов
/ 05 мая 2011

Во-первых, вы должны поставить кавычки вокруг адреса электронной почты:

#define SERVICE_EMAIL "service@company.com"

Во-вторых, вам вообще не следует использовать #define. Вместо этого используйте переменную const:

const String SERVICE_EMAIL = "service@company.com";

#define s небезопасны, не имеют области видимости и обычно являются злыми.

Наконец, вы можете рассмотреть возможность использования std::string вместо вашего String класса.

Обновление

Проблема в том, что препроцессор #define s - это не более чем текстовые замены. Когда препроцессор будет готов, ваш компилятор увидит

_email = NOTIFICATION_CONSTANTS::"service@company.com";

В этом пространстве имен нет строковой константы. SERVICE_EMAIL не является идентификатором любого рода - это просто указание препроцессору заменить любое вхождение SERVICE_EMAIL на "service@company.com".

Решение состоит в том, чтобы удалить квалификатор пространства имен:

_email = SERVICE_EMAIL;

Лучшее решение:

Если у вас нет доступа к #define, вам следует поместить его в заголовочный файл, если это возможно:

#include "Notification_Constants.h"

namespace NOTIFICATION_CONSTANTS {
    const String REAL_SERVICE_EMAIL = SERVICE_EMAIL;
}

и затем используйте NOTIFICATION_CONSTANTS::REAL_SERVICE_EMAIL вместо него, у которого есть область видимости, тип, правильный член пространства имен и т. Д.

1 голос
/ 05 мая 2011

Проблема, я думаю, поскольку я не знаю тип String, заключается в том, что SERVICE_EMAIL должен быть строковым литералом:

#define SERVICE_EMAIL "service@company.com"

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

0 голосов
/ 05 мая 2011

Какой тип service@company.com?Я думаю, что вы хотите использовать строку для хранения адреса электронной почты.

Попробуйте:

 #define SERVICE_EMAIL "service@company.com"
0 голосов
/ 05 мая 2011
#define SERVICE_EMAIL "service@company.com"
...