gpt4 book ai didi

c++ - 关键字 'template' 混淆了 MSVC

转载 作者:可可西里 更新时间:2023-11-01 18:29:03 28 4
gpt4 key购买 nike

关于模板的“哪个编译器是正确的”问题之一。考虑以下内容:

template<typename T>
class Container
{
public:
template<typename V>
class iterator;
};

template<typename T>
template<typename V>
class Container<T>::iterator
{
public:
iterator &operator++();
};

现在为 operator++ 提供定义离线它看起来像这样:

template<typename T>
template<typename V>
typename Container<T>::template iterator<V> &Container<T>::iterator<V>::operator++()
{
//do your thing
return *this;
}

果然几乎任何版本的 GCC 4.8+ 和 Clang 3.2+ 都可以编译它。然而 MSVC19+ 却没有,它特别不喜欢 template该定义中的关键字。它提示它无法匹配特别有趣的声明和定义,因为它给出了它寻找的内容和“候选人”,而且它们都是相同的。如果template被删除所以只有typename Container<T>::iterator<V>被使用,MSVC 编译它就好了。然而,Clang 和 GCC 将失败。

您可以在 Compiler Explorer 上实时试用:live demo

那么谁是对的呢?由于 GCC 和 Clang 都有这个很长一段时间,我倾向于倾向于他们。但是我想支持这三个。所以我要么将它移到类内定义,要么使用 #ifdef ?似乎有误,如果 MSVC 在这里有误,应该报告(除非它是已知问题)。

最佳答案

您可以使用尾随返回类型来简化代码。不需要 typenametemplate:

template<typename T>
template<typename V>
auto Container<T>::iterator<V>::operator++() -> iterator<V> &
{
//do your thing
return *this;
}

online compiler

关于c++ - 关键字 'template' 混淆了 MSVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48814193/

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