依赖作用域中的类型名称
typename in dependent scope
下面是我的代码的精简版本,它给了我一个编译器错误。编译器告诉我把typename放在'std::d eque::reverse_iterator'前面,这是有道理的。但是如果我这样做,我会在底部收到错误。什么意思?如何解决?
#include <iostream>
#include <deque>
template<class T>
class Stack{
public:
Stack(){}
~Stack(){}
void push(T c) { s.push_back(c); }
void inspect() const{
for(typename std::deque<T>::reverse_iterator i=s.rbegin(); i!=s.rend(); i++)
std::cout << *i << std::endl;
}
private:
typename std::deque<T> s;
};
int main(){
Stack<int> s;
s.push(1);
s.inspect();
return 0;
}
错误:
error: no matching function for call to 'std::_Deque_iterator<int, int&, int*>::_Deque_iterator(std::reverse_iterator<std::_Deque_iterator<int, const int&, const int*> >::iterator_type)'|
note: candidates are:|
note: std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Deque_iterator(const iterator&) [with _Tp = int; _Ref = int&; _Ptr = int*; std::_Deque_iterator<_Tp, _Ref, _Ptr>::iterator = std::_Deque_iterator<int, int&, int*>]|
note: no known conversion for argument 1 from 'std::reverse_iterator<std::_Deque_iterator<int, const int&, const int*> >::iterator_type {aka std::_Deque_iterator<int, const int&, const int*>}' to 'const iterator& {aka const std::_Deque_iterator<int, int&, int*>&}'|
note: std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Deque_iterator() [with _Tp = int; _Ref = int&; _Ptr = int*]|
note: candidate expects 0 arguments, 1 provided|
note: std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Deque_iterator(_Tp*, std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Map_pointer) [with _Tp = int; _Ref = int&; _Ptr = int*; std::_Deque_iterator<_Tp, _Ref, _Ptr>::_Map_pointer = int**]|
note: candidate expects 2 arguments, 1 provided|
std::deque<T>
没有任何依赖性,所以不能有typename
。只有左侧依赖于模板参数的::
右侧的内容是相关的。
这
是一个很好的例子,说明使用auto
比节省打字更能帮助您。您正在使用const
成员函数,但尝试使用数据成员的reverse_iterator
,而不是const_reverse_iterator
。
将typename std::deque<T>::reverse_iterator
更改为 typename std::deque<T>::const_reverse_iterator
,或者更简单地说,auto
。
这是对数据成员的额外typename
的补充。
相关文章:
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++/错误:表达式必须具有整数或无作用域枚举类型
- 用于返回嵌套类类型的作用域解析运算符
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 作用域中的模板变量或模板类型定义
- 错误:以增量方式填充向量时,表达式必须具有整数或无作用域枚举类型
- 无作用域枚举的基础类型?
- 错误:数组大小表达式必须具有整型或无作用域枚举类型,而不是'double'
- 无作用域枚举、枚举器和基础类型C++中的歧义
- 我可以使用相同的名称为周围作用域中的类型声明成员类型别名吗
- 依赖作用域中的类型名称
- 表达式必须具有整数或无作用域枚举类型,并带有字符串向量
- GetBValue 错误:表达式必须具有整数或无作用域枚举类型
- 重载操作符+:表达式必须是整型或无作用域枚举类型
- 为什么可以在没有初始化项的情况下跳转到标量类型对象的作用域?
- 为什么我的方程给出错误必须有一个积分表达式或无作用域enun类型
- 类类型作用域