2015-04-10 2 views
0

Я читал posts по этой теме. Но у меня все еще возникает проблема, когда я пытаюсь это сделать.C++ Шаблон в макросах

template<typename T> struct argument_type; 
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; }; 

#define TEST_TYPE2(who) typename animal < argument_type<T(who)>::type > 

template<typename T, typename T2> 
struct Pig 
{ 
    typedef TEST_TYPE2(int) type; 
}; 

я получить ошибка компиляции

warning C4346: 'argument_type<T(int)>::type' : dependent name is not a type 
prefix with 'typename' to indicate a type 
see reference to class template instantiation 'Pig<T,T2>' being compiled 
error C2923: 'animal' : 'argument_type<T(int)>::type' is not a valid template type argument for parameter 'T' 

Однако, если я изменю

#define TEST_TYPE2(who) typename animal < argument_type<T(who)>::type > 

ниже

#define TEST_TYPE2(who) typename argument_type<T(who)>::type 

Он отлично компилируется. Кажется, что компилятор не может распознать «:: type» после того, как я положил его в скобки <>.

Что я могу сделать, чтобы это сработало?

+0

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

+0

Я немного уточнил свой вопрос. И я также пробовал код без marco, и они действительно работают. Это терпит неудачу, когда я помещаю их в марко. – HBZ

+0

В любом случае, в C++ 11 вы можете вместо этого использовать 'template using test_type2 = animal :: type>;', а затем в 'Pig':' using type = test_type2 ; ' – Jarod42

ответ

2

Я думаю, что вы только что получили ваш typename в неправильном месте; он должен предшествовать argument_type<T(who)>::type кусок, а не animal<...> часть:

template<typename T> struct animal {}; 

template<typename T> struct argument_type; 
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; }; 

#define TEST_TYPE2(who) animal<typename argument_type<T(who)>::type> 

template<typename T, typename T2> struct Pig { 
    typedef TEST_TYPE2(int) type; 
}; 

int main(void) { 
    return 0; 
} // end main() 

выше компилируется нормально для меня.

2

Ожидается, что необходимо использовать typename, но попробуйте его таким образом.

#define TEST_TYPE2(who) animal < typename argument_type<T(who)>::type > 
Смежные вопросы