【发布时间】:2016-01-05 18:04:05
【问题描述】:
我有这门课:
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 compiles fine 添加 typename,MSVC 仍然出错。
【问题讨论】:
-
还有
typename? -
我觉得我不得不添加这个强制性评论:你这样做只是为了好玩,看看 decltype 是如何工作的?因为在实际代码中,你应该只在这种情况下使用 auto,
auto itr = data.end();,然后如果你以后确实需要该类型,你可以使用decltype(itr),这很少见(并且不适用于此代码)。 -
@NirFriendman 这确实只是为了好玩。我也可以删除函数头中的显式类型返回,但这个错误没有意义,因为我问它是否只是一个错误或我的代码。
-
那个该死的 MSVC... :)
-
this
decltype的用法似乎在 MSVC 中编译