模板上的宏

时间:2011-09-16 15:31:19

标签: c++ templates macros

不确定我想做的事情是不是很糟糕,但这是我的问题: 我有一些模板功能,如

std::vector<T> operator - (const std::vector<T>& data1, const std::vector<T>& data2);
std::vector<T> operator * (const std::vector<T>& data1, const std::vector<T>& data2);
std::vector<T> operator & (const std::vector<T>& data1, const std::vector<T>& data2);

....等等。除了运算符之外,所有这些函数都具有完全相同的定义,因此我尝试编写像这样的宏

#define _BINARY_OP_ON_DATASET (OP_TYPE)
  template <typename T> \
  std::vector<T> operator OP_TYPE (const std::vector<T>& data1, const std::vector<T>& data2)\
  {\
    std::vector<T> result;\
    result.push_back(data1.begin().val OP_TYPE data1.begin().val)/*sample implementation*/\
    return result;\
  }

_BINARY_OP_ON_DATASET (&)
_BINARY_OP_ON_DATASET (+)

我得到了一堆错误

Error   1   error C2833: 'operator OP_TYPE' is not a recognized operator or type
Error   2   error C2988: unrecognizable template declaration/definition
Error   3   error C2059: syntax error : 'newline'
Error   5   error C2143: syntax error : missing ';' before '<'
Error   6   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

......等等 任何人都可以看到这个问题是什么?

感谢您的帮助。

CV

4 个答案:

答案 0 :(得分:3)

删除宏名称及其参数之间的空格。

#define _BINARY_OP_ON_DATASET(OP_TYPE)

\添加到模板的第一行

#define _BINARY_OP_ON_DATASET(OP_TYPE)\

删除小错误,例如您在函数体第二行中忘记的;

result.push_back(data1.begin().val+data1.begin().val);

它汇编得很好!

答案 1 :(得分:2)

宏参数列表前没有空格!

#define _BINARY_OP_ON_DATASET(OP_TYPE) ...
                            ^^^

答案 2 :(得分:2)

宏参数列表前面有一个无效空格,并且错过了后面的换行符:

#define _BINARY_OP_ON_DATASET(OP_TYPE) \
    ...

答案 3 :(得分:0)

我认为重复这个定义会比对它们进行宏观操作更简单:)有时候重复自己要比提高打字效率更好。