C++: ошибка: ожидается неполный идентификатор перед токеном «!»

Я уже прочитал большинство соответствующих ответов по этой теме, но не могу найти ничего плохого в своем коде. Ниже мой код:

oneaborq.cc

...
#include "stdmacro.h"
...

class marker_t {
public:
   signed_city_id_t val;
   inline marker_t() { val = 0; };
   inline signed_city_id_t is_true() { return val; };
   inline signed_city_id_t is_false() { return (signed_city_id_t)!val; };
   inline void make_true() { val = 1; };
   inline void not() { val = (signed_city_id_t)!val; };
};

stdmacro.h

#define LARGE_CITY_ID
...
typedef
#ifdef UNSIGNED_CITY_ID
unsigned
#else
signed
#endif
#ifdef LARGE_CITY_ID
short
#else
char
#endif
city_id_t;

/* signed_city_id_t is the same sizeof() as the city_id_t but can be negative
 * and should be asserted not to go more than positive MAX_DEGREE/2
 */
typedef
signed
#ifdef LARGE_CITY_ID
short
#else
char
#endif
signed_city_id_t;

Я пытался изменить «signed_city_id_t» на явно «short» или «int» в oneaborq.cc, но это, похоже, не помогло. Я также попытался просто изменить определение всего класса на:

class marker_t {
public:
   int val;
   inline marker_t() { val = 0; };
   inline int is_true() { return 0; };
   inline int is_false() { return 0; };
   inline void make_true() { val = 1; };
   inline void not() { val = 0; };
};

Даже когда нет "!" во всем определении класса по-прежнему возникает одна и та же ошибка: «oneaborq.cc: 207: ошибка: ожидается неквалифицированный идентификатор перед токеном '!'"

Я пытаюсь скомпилировать решатель TSP (Travelins Salesman Problem) (находится здесь: http://www.cs.sunysb.edu/~algorith/implement/tsp/distrib/tsp_solve) в OS X, поэтому, если кто-то хочет увидеть весь исходный код, взгляните на ссылку выше.


person Nullified    schedule 29.01.2012    source источник
comment
Одна проблема заключается в том, что marker_t() не имеет возвращаемого типа.   -  person rerun    schedule 30.01.2012
comment
Удивлен, что функции is_* не возвращают bool. И что вообще должен делать (signed_city_id_t)!val? ! дает результат bool (или, по крайней мере, похожий на bool), и изменение его на идентификатор города кажется глупым. Кроме того, "stdmacro.h" выглядит запутанным; почему бы не использовать шаблонный тип для идентификатора города?   -  person Mike DeSimone    schedule 30.01.2012
comment
@rerun: marker_t() - это конструктор. Не допускается возвращаемый тип.   -  person Mike DeSimone    schedule 30.01.2012
comment
Упс, да, я думал, что это другая функция   -  person rerun    schedule 30.01.2012


Ответы (1)


inline void not() { val = (signed_city_id_t)!val; };

not похоже на ключевое слово в C++ и является альтернативным написанием токена !. Вы не можете использовать его как имя функции.

person Johannes Schaub - litb    schedule 29.01.2012
comment
как ключевое слово == зарезервированное слово? - person Mike DeSimone; 30.01.2012
comment
да, это зарезервированные слова. технически они не являются ключевыми словами, но очень похожи на них. - person Johannes Schaub - litb; 30.01.2012
comment
Просто убедитесь, что зарезервированное слово по-прежнему что-то значит, и стандарт не осуждает его, не отбрасывает и не начинает использовать как ключевое слово. - person Mike DeSimone; 30.01.2012