gpt4 book ai didi

c++ - 使用 decltype 返回迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:02 27 4
gpt4 key购买 nike

我有这门课:

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): error C3646: 'iterator': unknown override specifier

我不明白为什么它不让我返回 iterator类型 std::list<T>而正文代码:

decltype(data)::iterator itr = data.end();

decltype(data)::iterator itr = data.begin();

编译成功

我怎样才能成功返回 std::list iterator使用 decltype明确?

删除 -> decltype(data)::iterator确实编译成功。

编辑:使用 GCC 编译并添加 typename对于每个 decltype compiles fine , 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++ - 使用 decltype 返回迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34618338/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com