我正在创建一个堆栈的类。我想使用迭代器来获取结尾的元素并访问它的函数。但是我收到以下错误
setOfStacks.cpp:40:6: error: expected ';' after expression
set< stack<Type> >::iterator it = mSetOfStacks.end();
^
;
该类使用模板,并按此声明
template<typename Type>
class SetOfStacks
{
public:
SetOfStacks(int capacityPerStack);
void push(Type object);
Type pop();
bool isEmpty();
private:
void createNewStackWithElem(Type object);
private:
int mStackCapacity;
set<stack<Type> > mSetOfStacks;
};
然后在我的插入函数中,我尝试在最后得到堆栈
set< stack<Type> >::iterator it = mSetOfStacks.end();
if( *it->size() < mStackCapacity )
*it->push(object);
这是我在尝试声明迭代器时遇到错误的地方 setOfStacks.cpp:40:6:错误:预期';'表达后
另外,我试过
set<stack<Type> >::iterator it = mSetOfStacks.end();
但它无效
整个推送功能
template<typename Type>
void SetOfStacks<Type>::push(Type object) {
// if entire set is empty make a new stack
if( mSetOfStacks.empty() ) {
stack<Type> newStack;
newStack.push(object);
mSetOfStacks.insert(newStack);
}
else {
// check if current stack within limits
set< stack<Type> >::iterator it = mSetOfStacks.end();
if( *it->size() < mStackCapacity )
*it->push(object);
else {
// duplicate code, make another function
stack<Type> newStack;
newStack.push(object);
mSetOfStacks.insert(newStack);
}
}
}
答案 0 :(得分:3)
在函数模板中,嵌套名称iterator
是一个从属名称,它被认为是一个对象而不是一个类型。您想使用iterator
关键字指明typename
是一种类型:
typename std::set<std::stack<Type> >::iterator it = mSetOfStacks.end();
// ^-- here
模板分两个阶段进行解析:在第一阶段,代码被解析为其逻辑组件,而不知道模板参数或实体,具体取决于模板参数的外观。如果根据模板参数存在嵌套名称,则编译器会假定此名称是对象而不是类型,除非您明确声明它是使用typename
关键字的类型。
答案 1 :(得分:1)
auto
是完美的关键字:
auto it = mSetOfStacks.end();
答案 2 :(得分:1)
使用C ++ 11时,您不需要指定迭代器类型来在从mSetOfStacks.end()
之类的内容初始化时定义迭代器。您可以改为使用auto
:
auto it = mSetOfStacks.end();
此外,您不应该访问此迭代器,因为它指向一个元素超过结束。如果你想要集合中的最后一个元素,在访问它之前递减迭代器:
--it;
// then use *it
或使用引用变量引用最后一组:
auto & lastSet = *(--it);
// then use lastSet instead of *it
如果您的编译器不支持auto
,请使用Dietmar的解决方案。