E2321 Декларация не указывает тег или идентификатор - PullRequest
1 голос
/ 19 января 2011

Я портирую код с VS2005 на C ++ Builder XE, чтобы он компилировался с обоими компиляторами.Следующий код прекрасно компилируется под VS2005, но в C ++ Builder я получаю сообщение об ошибке субъекта с помощью встроенной функции rawtime ();

(в декларации E2321 не указан тег или идентификатор).

Вот код:

template<typename counter_type>
class synchronizer
{
private:
// PRIVATE TYPES

typedef timer<counter_type>                     timer_type;
typedef reference_point<counter_type>           reference_point_type;
typedef time_data<counter_type>                 time_data;
typedef typename timer_type::time_stamp_type    time_stamp_type;
typedef typename timer_type::time_span_type     time_span_type;
typedef typename filetime_counter::value_type   time_type;
typedef typename counter_type::value_type       counter_value_type;
typedef synchronizer<counter_type>              this_type;

/* some code removed for sake of this post */

public:

typedef counter_type  counter_type;
typedef typename counter_type::value_type raw_value_type;
TIMESTATS_STMT(typedef statistics<counter_type> statistics_type);

inline raw_value_type rawtime() const   /* Subject ERROR coming from this line */
{
  return m_timer.now().value();
}

Я пытался следовать результатам этого поста, который решил эту конкретную проблему, но не эту. проблема перегрузки оператора класса шаблона

Мысли / Коммнет?

--- EDIT:

Обратная связь, предполагающая, что TIMESTATS_STMT является актуальной причиной ошибки, поэтому здеськак это определяется.Обратите внимание, что TIME_ENABLE_STATISTICS закомментирована как в VS2005, так и в C ++ Builder XE.

// #define TIME_ENABLE_STATISTICS
//

//
// Make null definitions
//
#define TIMESTATS_VAR(var, type, initial)
#define TIMESTATS_STMT(stmt)

#ifdef TIME_ENABLE_STATISTICS

//
// Make real definitions
//
#undef  TIMESTATS_VAR
#define TIMESTATS_VAR(var, type, initial) type var = initial
#undef  TIMESTATS_STMT
#define TIMESTATS_STMT(stmt) stmt

--- EDIT

ошибочная строка действительно является строкой TIMESTATS_STMT.Я смог исправить, определив NULL #define следующим образом.

#ifdef TIME_ENABLE_STATISTICS
  TIMESTATS_STMT(typedef statistics<counter_type> statistics_type);
#endif

Ответы [ 2 ]

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

Неправильно: TIMESTATS_STMT(typedef statistics<counter_type> statistics_type);

Правильно: TIMESTATS_STMT(typedef statistics<counter_type> statistics_type)

Удалите точку с запятой после макроса.Макрос - мощное расширение языка, но иногда очень-очень опасный и непредсказуемый.

Мне нравится использовать макросы C ++, но они злые.

1 голос
/ 19 января 2011

Не зная, что расширяется до TIMESTATS_STMT, трудно сказать, но я держу пари, что проблема на самом деле возникает в строке раскрытия макроса и помечается следующей строкой, что мне кажется хорошим.

...