我有这门课:
templateclass Hybrid { public: Hybrid() : m_activeStackSize(0) {} private: std::list 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:'iterator':未知的覆盖说明符
我不明白为什么它不会让我返回一个iterator
类型std::list
的身体代码:
decltype(data)::iterator itr = data.end();
和
decltype(data)::iterator itr = data.begin();
编译成功.
我如何成功地成功返回std::list iterator
使用decltype
?
删除-> decltype(data)::iterator
确实编译成功.
编辑:
使用GCC typename
进行decltype
编译并为每个编译添加正常,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::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; } }