E2321声明未指定标签或标识符

时间:2011-01-19 14:37:55

标签: c++ function inline declaration

我正在将代码从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();
}

我试着按照这篇文章的结果解决了这个问题,但没有解决这个问题。 template class operator overloading problem

思想/ Commnets?

---编辑:

建议TIMESTATS_STMT的反馈是错误的真正原因,因此这是如何定义的。请注意,在VS2005和C ++ Builder XE中都注释掉了TIME_ENABLE_STATISTICS。

// #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

---编辑

违规行似乎是TIMESTATS_STMT行。我可以通过取消定义NULL #define来纠正如下。

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

2 个答案:

答案 0 :(得分:1)

在不知道TIMESTATS_STMT扩展到什么的情况下很难说,但我打赌问题实际上发生在宏扩展的行上,并被标记为以下行,这对我来说很好。

答案 1 :(得分:1)

错误:TIMESTATS_STMT(typedef statistics<counter_type> statistics_type);

正确:TIMESTATS_STMT(typedef statistics<counter_type> statistics_type)

删除宏后的分号。宏是一种强大的语言扩展,但有时非常危险和不可预测。

我喜欢使用C ++宏,但它们是邪恶的。