Res*_*ion 7 c++ templates visual-c++
其中一个关于模板的"哪个编译器是正确的"问题.考虑以下:
template<typename T>
class Container
{
public:
template<typename V>
class iterator;
};
template<typename T>
template<typename V>
class Container<T>::iterator
{
public:
iterator &operator++();
};
Run Code Online (Sandbox Code Playgroud)
现在,当为operator++外线提供定义时,它看起来像这样:
template<typename T>
template<typename V>
typename Container<T>::template iterator<V> &Container<T>::iterator<V>::operator++()
{
//do your thing
return *this;
}
Run Code Online (Sandbox Code Playgroud)
几乎任何版本的4.8 +和Clang 3.2+的GCC都可以编译它.但是,MSVC19 +没有,它特别不喜欢该template定义中的关键字.它抱怨说它不能与声明和定义相匹配,因为它给出了它所寻找的内容和"候选人"并且它们都是相同的.如果template被删除所以只typename Container<T>::iterator<V>使用,MSVC编译它就好了.然而,Clang和GCC将失败.
您可以在Compiler Explorer中试用它:现场演示
那么谁是对的?由于GCC和Clang都有很长一段时间,所以我倾向于倾向于他们.但是,我想支持这三个.那么要么我把它移到类内定义还是使用#ifdef?似乎错了,如果MSVC在这里出错了,应报告(除非是已知问题).
您可以使用尾随返回类型来简化代码.不需要typename或template:
template<typename T>
template<typename V>
auto Container<T>::iterator<V>::operator++() -> iterator<V> &
{
//do your thing
return *this;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
254 次 |
| 最近记录: |