使用模板别名,继承模板和使用“模板父级”类型时编译错误

时间:2012-07-18 20:40:32

标签: c++ templates c++11 gcc4.7 template-aliases

我有一个数据容器,它有以下要求:

  • 快:因此模板而不是正常继承
  • 使用不同的实现
  • 能够使用更多方法扩展这些实现
  • 数据是通过模板参数指定的,需要能够保存指向数据容器项的指针

我提出的解决方案如下:

    template<typename T, template<typename> class container_t>
class data_c
{
public:
    typedef data_c<T, container_t> value_type;
    typedef typename container_t<value_type>::ref container_ref;

    container_ref link;
    T c;
};

template<typename T>
class storage_container_impl
{
public:
    typedef T value_type;
    typedef storage_container_impl<T>* ref;
    T data;
};

template<typename _impl>
class storage_container : public _impl
{
public:
    typedef typename _impl::value_type value_type;
    typedef typename _impl::ref ref;
};

template<typename T>
using impl_storage_container = storage_container<storage_container_impl<T> >;

typedef impl_storage_container<data_c<int, impl_storage_container> > c_storage_container;

int main()
{
    c_storage_container tmp;
    tmp.data.c=5;
    tmp.data.link=&tmp;
    return tmp.data.c;
}

导致以下错误(gcc 4.7):

test1.cpp:6:48: error: no type named 'ref' in 'impl_storage_container<data_c<int, impl_storage_container> > {aka class storage_container<storage_container_impl<data_c<int, impl_storage_container> > >}'

如果我使用T *data代替T data(但我不想要间接),或者如果我不直接使用storage_container_impl并且T data storage_container。使用storage_container_impl mixin-style也无法解决问题。由于container_ref是指针,因此也没有理由说它不起作用,例如因为模板声明中有一个循环。这是问题的最小化版本。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

我知道它不是一个完美的解决方案,但您可以尝试替换

typedef impl_storage_container<data_c<int, impl_storage_container> > c_storage_container;

typedef impl_storage_container<data_c<int, storage_container_impl> > c_storage_container;

它编译和工作。否则你会得到无穷无尽的类型递归。