派生类中的类型定义未知
typedef unknown in derived class
我正在尝试编写一个容器适配器。我还想在派生类中使用基类中的类型定义。所以我尝试了以下方法…
template <class CONTAINER> class SequenceComposite {
protected:
CONTAINER m_data;
public:
typedef typename CONTAINER::size_type size_type;
// ...
};
template <class DTYPE>
class VectorComposite : public virtual SequenceComposite< std::vector<DTYPE> > {
public:
size_type capacity() const { m_data.capacity(); }
// ...
};
我得到了这个错误…
error: ‘size_type’ does not name a type
note: (perhaps ‘typename SequenceComposite<std::vector<T> >::size_type’ was intended) // yes, it was
我如何告诉编译器我想从基类中使用类型定义?
我能够做到这一点,这里有一篇关于c++模板的依赖名称查找的好文章,它涵盖了如何解决m_data
的问题:
template <class DTYPE>
class VectorComposite : public virtual SequenceComposite< std::vector<DTYPE> >
{
public:
typedef typename SequenceComposite< std::vector<DTYPE> >::size_type size_type ;
size_type capacity() const
{
this->m_data.capacity() ;
}
// ...
};
或者您也可以使用using
:
using typename SequenceComposite< std::vector<DTYPE> >::size_type ;
虽然我不认为这使它更好,jrok
提出了一个更好的解决方案:
typename VectorComposite::size_type capacity() const
{
this->m_data.capacity() ;
}
在派生类型的上下文中,size_type
是一个非依赖的名称,因此它将在模板的上下文中查找,而不实例化基模板。如果需要使用它,最简单的方法是克隆派生类型中的类型定义:
typename VectorComposite::size_type size_type; // [*]
[*]按照jrok对原始错误代码的修复
这样放置base的size_type
:
typename SequenceComposite<std::vector<DTYPE>>::size_type capacity() const{ //..
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如何定义在编译时数据未知的 const 数组
- C++ 未知类型名称,即使类型是通过标头定义的
- 将参数列表未知的可变参数模板类型定义为 std::map 值类型
- std::vector 如何支持未知大小的自定义对象的连续内存
- 如何在if/else序列中定义未知类型的全局变量
- 是否可以检查是否为类定义了成员函数,即使该成员继承自未知基类
- 定义具有未知深度/维度的 C++ 模板
- 定义具有未知数量子项的树
- 由于未知的模板定义,模板专用化失败
- 编译 opencv 框架时出现未知错误:未定义的符号:"_CGImageDestinationCreateWithURL"
- 是使用未知转义序列调用c++中未定义的行为
- 派生类中的类型定义未知
- 对的未定义引用WinMain@16和未知的杂注
- 定义一个在c++中行数(clos)未知的数组