Макро задача C ++ (интерпретация запятой,) - PullRequest
2 голосов
/ 18 марта 2011

Следующий код компилируется нормально.

#define CMD_MACRO(pp, cmd)  \
{           \
      if (pp)\
      { cmd; }        \
}

template<class T> void operate_on(T &data, char c) {
  data=data+1;
};

int main() {
  int book=4;
  char c;
    CMD_MACRO(book, {
        operate_on<int>(book, c);
    });
};

Обратите внимание, что фактический макрос в моем коде более сложный, я дал упрощенную версию, которая может не иметь большого логического смысла

Теперь, если я добавлю другой параметр шаблона в функцию, это выдаст ошибку компиляции (проблема объяснена в комментарии к коду):

template<class T, bool b> void operate_on(T &data, char c) {
  data=data+1;
};
int main() {
      int book=4;
      char c;
        CMD_MACRO(book, {
            operate_on<int, false>(book, c); /* here the "," between int and 
                  false is being treated 
                  as separating arguments to CMD_MACRO, 
                  instead being part of 'cmd'. Thats strange 
                  because the comma separating book and c is 
                  treated fine as part of 'cmd'. */
        });
};


test.cpp:18:6: error: macro "CMD_MACRO" passed 3 arguments, but takes just 2
test.cpp: In function 'int main()':
test.cpp:16: error: 'CMD_MACRO' was not declared in this scope

Как решить проблему (мне нужно добавить этот дополнительный параметр шаблона в существующий код, и я получаю такую ​​ошибку).

1 Ответ

6 голосов
/ 18 марта 2011

Вы пробовали: (operate_on<int, false>(book, c));?(Обратите внимание на дополнительные скобки вокруг выражения).

Я считаю, что препроцессор ничего не знает о шаблонах C ++ и поэтому обрабатывает < и > как любой старый токен.Без лишних скобок он обрабатывает operate_on<int как один аргумент, а false>(book, c) как другой.

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