2016-09-23 3 views
0

Почему следующий код не работает?Тип макроса для типа не работает

// Template function definition 
template <typename T> 
void apply(const T& input); 

// Helper macro definition 
#define APPLY_FUNCTION(PIXELTYPE) \ 
    apply<##PIXELTYPE>(input); 

// Use macro to call function 
APPLY_FUNCTION(uint8_t); 

Это дает следующее сообщение об ошибке:

Error: pasting "<" and "uint8_t" does not give a valid preprocessing token

+0

Даже если вы исправите макрос, где вы получаете 'input', чтобы перейти к функции? – NathanOliver

+2

Макросы не заканчиваются точкой с запятой. –

+0

Не говорите, что вы ошибаетесь, но наличие этого «ввода» внутри вашего макроса, похоже, не является лучшей практикой, которую вы могли бы выбрать. –

ответ

0

Зачем вам нужно указывать тип параметра шаблона в любом случае? Если вы специально не хотите макрос, то просто с помощью применения функции непосредственно будет работать нормально:

template <class T> 
    void apply(const T & input) 
    { 
     //... 
    } 

    apply(1.0f); // Will instantiate apply<float> to match the input's type 

Если вы хотите, тип T будет отличаться от того, что передается в, то я бы предложил следующий шаблон вместо:

template <class T, class Input> 
    void apply(const Input & input) 
    { 
     T t(input); 
     //... 
    } 

, который затем может быть вызван:

apply<uint8_t>(1.0f); 

И нет никакой необходимости для этого макроса вообще.

8

## для вставки жетонов вместе. Вам не нужно, так просто:

#define APPLY_FUNCTION(PIXELTYPE) apply<PIXELTYPE>(input); 

Тем не менее, два указания:

  1. Не заканчивайте макрос с ; требуя от пользователя, чтобы добавить это избавит вас от некоторых ошибок ,
  2. Пожалуйста, не пишите этот макрос.
0

В макрорасширении ## сообщает компилятору объединить маркер, который предшествует ему, с его токеном и обрабатывать результат как один токен. Как сказано в сообщении об ошибке, <uint8_t не является допустимым токеном. Просто избавьтесь от ##.

Смежные вопросы