4

基础结构:

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. 

如何解决这个问题?

4

2 回答 2

8

Specialize the Bar struct for a pointer-to-T type:

//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;
};
于 2012-08-29T06:11:44.450 回答
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;
};
于 2012-08-29T06:18:05.153 回答