使用decltype返回迭代器
Using decltype to return iterator
我有这个类:
template <typename T>
class Hybrid
{
public:
Hybrid() : m_activeStackSize(0) {}
private:
std::list<T> data;
size_t m_activeStackSize;
auto internal_peek() -> decltype(data)::iterator
{
if (m_activeStackSize) // peek from stack
{
decltype(data)::iterator itr = data.end();
std::advance(itr, -1);
return itr;
}
else //peek from queue
{
decltype(data)::iterator itr = data.begin();
return itr;
}
}
};
当试图在Microsoft Visual Studio 2015上编译时,我得到了:
main.cpp(12):错误C3646:"迭代器":未知重写说明符
我不明白为什么它不让我返回std::list<T>
类型的iterator
,而正文代码:
decltype(data)::iterator itr = data.end();
和
decltype(data)::iterator itr = data.begin();
编译成功。
如何显式使用decltype
成功返回std::list iterator
?
删除-> decltype(data)::iterator
编译成功。
编辑:用GCC编译并为每个decltype
添加typename
编译得很好,MSVC仍然会出错。
decltype(data)::iterator
是一个依赖类型。因此,必须使用typename
。
auto internal_peek() -> typename decltype(data)::iterator
// ^^^^^ here
{
if (m_activeStackSize) // peek from stack
{
typename decltype(data)::iterator itr = data.end();
// ^^^^^ and here
std::advance(itr, -1);
return itr;
}
else //peek from queue
{
typename decltype(data)::iterator itr = data.begin();
// ^^^^^ and here
return itr;
}
}
MSVC可能的变通办法。
// Declare iterator as a type.
using iterator = typename std::list<T>::iterator;
iterator internal_peek()
{
if (m_activeStackSize) // peek from stack
{
iterator itr = data.end();
std::advance(itr, -1);
return itr;
}
else //peek from queue
{
iterator itr = data.begin();
return itr;
}
}
在C++14中,您根本不需要decltype()。根据C++14,以下是正确的(据我所知,MSVC并不完全支持C++14):
auto internal_peek()
{
if (m_activeStackSize) // peek from stack
{
auto itr = data.end();
std::advance(itr, -1);
return itr;
}
else //peek from queue
{
auto itr = data.begin();
return itr;
}
}
相关文章:
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 如何从高性能的输入迭代器返回变体?
- 如何为迭代器返回"null"值?
- 将迭代器返回到向量的函数
- 迭代器返回 vector::begin()
- 访问对向量以使用迭代器返回
- 获取迭代器返回的字符串的大小()
- 如何让Lua迭代器返回C结构
- 迭代器返回最后一个元素上的"Junk"
- 指向矢量迭代器返回值的指针
- 使用迭代器返回对字符串的引用
- 如何将指针作为迭代器返回
- 将迭代器返回到多映射中最接近指定时间的时间
- 通过迭代器返回set对象的地址
- 从迭代器返回一个std::list元素的引用
- 为我的向量包装器和迭代器返回'begin'和'end'函数返回什么?
- c++迭代器返回类型
- 从取消引用的迭代器返回 std::map<std::string, int> 时出现巨大的内存泄漏
- 迭代器返回垃圾
- 通过不使用模板的迭代器返回std::list