макрос на шаблонах - PullRequest
       25

макрос на шаблонах

3 голосов
/ 16 сентября 2011

Не уверен, что то, что я пытаюсь сделать, плохо, но вот мой вопрос: у меня есть несколько шаблонных функций, таких как

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 ]

3 голосов
/ 16 сентября 2011

Удалите пробел между именем макроса и его аргументами.

#define _BINARY_OP_ON_DATASET(OP_TYPE)

Добавьте \ в первую строку вашего шаблона

#define _BINARY_OP_ON_DATASET(OP_TYPE)\

Удалите незначительные ошибки, такие как; вы забыли во второй строке вашего тела функции

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

И оно хорошо компилируется!

2 голосов
/ 16 сентября 2011

Нет пробела перед списком аргументов макроса!

#define _BINARY_OP_ON_DATASET(OP_TYPE) ...
                            ^^^
2 голосов
/ 16 сентября 2011

У вас есть недопустимый пробел перед списком аргументов макроса, и вы пропустили экранирование новой строки после него:

#define _BINARY_OP_ON_DATASET(OP_TYPE) \
    ...
0 голосов
/ 16 сентября 2011

Я думаю, что повторение определения будет проще, чем их макросъемка :) Иногда лучше повторить себя, чем добиться большей эффективности печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...