Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用模板别名、继承模板和使用";模板父项';s";类型_C++_Templates_C++11_Gcc4.7_Template Aliases - Fatal编程技术网

C++ 使用模板别名、继承模板和使用";模板父项';s";类型

C++ 使用模板别名、继承模板和使用";模板父项';s";类型,c++,templates,c++11,gcc4.7,template-aliases,C++,Templates,C++11,Gcc4.7,Template Aliases,我有一个数据容器,它有以下要求: 要快:因此是模板,而不是正常的继承 使用不同的实现 能够用更多的方法扩展这些实现 数据是通过模板参数指定的,需要能够保存指向数据容器项的指针 我提出的解决办法如下: 模板 类数据 { 公众: 类型定义数据\u c值\u类型; typedef typename container\u t::ref container\u ref; 集装箱参考链接; tc; }; 模板 类存储\u容器\u impl { 公众: 类型定义T值_类型; typedef存储容器im

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

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

模板
类数据
{
公众:
类型定义数据\u c值\u类型;
typedef typename container\u t::ref container\u ref;
集装箱参考链接;
tc;
};
模板
类存储\u容器\u impl
{
公众:
类型定义T值_类型;
typedef存储容器impl*ref;
T数据;
};
模板
类存储\u容器:public\u impl
{
公众:
typedef typename _impl::value_type value_type;
typedef typename_impl::ref;
};
模板
使用impl_storage_container=存储_container;
typedef impl_storage_container c_storage_container;
int main()
{
c_存储_容器tmp;
tmp.data.c=5;
tmp.data.link=&tmp;
返回tmp.data.c;
}
导致以下错误(gcc 4.7):

test1.cpp:6:48:错误:“impl_storage_container{aka class storage_container}”中没有名为“ref”的类型

如果我使用
T*data
而不是
T data
(但我不希望这种间接方式),或者如果我不使用
storage\u container\u impl
而直接在
storage\u container
中使用
T data
,它就可以工作。使用
storage\u container\u impl
mixin样式也不能解决问题。由于
container\u ref
是一个指针,因此也不应该存在它不起作用的原因,例如,因为模板声明中有一个循环。这是问题的最小化版本。任何帮助都将不胜感激

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

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

typedef impl_storage_container c_storage_container;

它编译并运行。否则,您将得到无休止的类型递归。

我猜在声明
数据
时,会实例化
数据_c
,这反过来又指的是
存储容器
,这在该点上还不完整。Clang也不接受,我认为这表明它实际上是非法的。所以。。。您的容器应该包含包装器类型的单个实例、值类型的单个实例和指向容器的反向指针。这是真的吗?显而易见的问题:你有没有测量到虚拟多态性在你的情况下确实太慢了?@Philipp没有,我没有,但我正在处理其他人的代码,他选择了模板路径。如果这是非法的,我想我会把
link
保存为
void*
并强制转换。我不能引用这个标准,但是如果Clang和GCC同意有一个改变,他们是对的:)当我试图使用“普通”CRTP(没有模板参数)来表达
data\u c
时,我想我遇到了一个无休止的类型递归。这可能表明C++实际上不允许这种结构(尽管它可能允许模板模板参数更多类型递归,但我对它们的了解太少,不能肯定)。
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> > >}'
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;