宏中的 C++ 模板
C++ Template in macros
我已阅读 posts 关于此主题的内容。但是当我尝试这样做时仍然遇到问题。
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”。
我该怎么做才能让它发挥作用?
预计需要使用typename
,但请按此方式尝试。
#define TEST_TYPE2(who) animal < typename argument_type<T(who)>::type >
我想你把 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()
上面的编译对我来说很好。
我已阅读 posts 关于此主题的内容。但是当我尝试这样做时仍然遇到问题。
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”。
我该怎么做才能让它发挥作用?
预计需要使用typename
,但请按此方式尝试。
#define TEST_TYPE2(who) animal < typename argument_type<T(who)>::type >
我想你把 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()
上面的编译对我来说很好。