基础结构:
struct Foo{
typedef int inner_type;
};
template<class T>
struct Bar{
typename T::inner_type x;
};
主要:
Bar<Foo>(); // Compiles OK
Bar<Foo*>(); // Doesn't compile: template T becomes a pointer-to-class and is not a valid class anymore.
如何解决这个问题?
答案 0 :(得分:8)
将Bar
结构专门用于指向T
类型的指针:
//non-specialized template for generic type T
template<class T>
struct Bar{
typename T::inner_type x;
};
//specialization for pointer-to-T types
template<class T>
struct Bar<T*>{
typename T::inner_type x;
};
答案 1 :(得分:7)
如果您需要在专门化模板很困难的情况下执行此操作,您还可以使用某些适当的模板计算要使用的类型:
template<class T> struct remove_all_pointers {
typedef T type;
};
template<class T> struct remove_all_pointers<T*> {
typedef typename remove_all_pointers<T>::type type;
};
template<class T> struct remove_all_pointers<T* const> {
typedef typename remove_all_pointers<T>::type type;
};
template<class T> struct remove_all_pointers<T* volatile> {
typedef typename remove_all_pointers<T>::type type;
};
template<class T> struct remove_all_pointers<T* const volatile> {
typedef typename remove_all_pointers<T>::type type;
};
struct Foo {
typedef int inner_type;
};
template<class T>
struct Bar {
typename remove_all_pointers<T>::type::inner_type x;
};