Я читал 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» после того, как я положил его в скобки <>.
Что я могу сделать, чтобы это сработало?
Используйте «/ E» для создания предварительно обработанного вывода, чтобы вы могли видеть, какие ваши макросы заменяются ... затем продолжайте изменять макросы, пока не получите код, который вы хотите. Если это слишком запутанно, сначала получите код без макросов, так что у вас есть цель для работы. –
Я немного уточнил свой вопрос. И я также пробовал код без marco, и они действительно работают. Это терпит неудачу, когда я помещаю их в марко. – HBZ
В любом случае, в C++ 11 вы можете вместо этого использовать 'template using test_type2 = animal :: type>;', а затем в 'Pig':' using type = test_type2 ; ' –
Jarod42