C++ gcc和c+的重载解析失败+;17
下面的代码无法使用gcc(9.2)和c++17进行编译。它可以与clang和MSVC一起工作,也可以与c++14一起工作。发生了什么,谁是对的,有没有简单的解决办法?求助于C++ gcc和c+的重载解析失败+;17,c++,gcc,c++17,C++,Gcc,C++17,下面的代码无法使用gcc(9.2)和c++17进行编译。它可以与clang和MSVC一起工作,也可以与c++14一起工作。发生了什么,谁是对的,有没有简单的解决办法?求助于#定义为gcc消除无序集重载,但我更喜欢“干净”的解决方案 #include <unordered_set> #include <iostream> struct Stream {}; template <typename T, typename Alloc, template<type
#定义
为gcc消除无序集
重载,但我更喜欢“干净”的解决方案
#include <unordered_set>
#include <iostream>
struct Stream
{};
template <typename T, typename Alloc, template<typename, typename> class Container>
Stream & operator<< (Stream &stream, const Container<T, Alloc>& container)
{
std::cout << "container" << std::endl;
return stream;
}
template <class K, class Hasher, class Keyeq, class Alloc>
Stream & operator<< (Stream &stream, const std::unordered_set<K, Hasher, Keyeq, Alloc> & container)
{
std::cout << "unordered_set" << std::endl;
return stream;
}
int main()
{
Stream t;
std::unordered_set<int> set;
t << set;
return 0;
}
#包括
#包括
结构流
{};
样板
流和操作符gcc是正确的;这是因为在C++17模式下,它实现的解析为,允许在匹配模板参数时忽略默认模板参数:
template <template <typename> class> void FD();
template <typename, typename = int> struct SD { /* ... */ };
FD<SD>(); // OK; error before this paper (CWG 150)
模板void FD();
模板结构SD{/*…*/};
FD();//好啊本文前的错误(CWG 150)
其他编译器(尚未)实现P0522,因此不认为通用重载是可行的
假设它是可行的,并且在C++17中函数模板的偏序规则下,两个各自的第二个参数都不能推导到另一个(Container
vs.std::unordered_set
),因此重载是不明确的。注释中的解决方案是使泛型重载更泛型,这样就可以推断出std::unordered_set
:
模板
Stream&Operator请在gcc的bugzilla上报告(或查找现有报告),并在您的问题中提供链接。将对T、Alloc替换为T…。
在第一个重载中似乎有帮助。难以置信的答案,非常感谢!(也要感谢@Marc)。(然而)
部分有点令人担忧
template <template <typename> class> void FD();
template <typename, typename = int> struct SD { /* ... */ };
FD<SD>(); // OK; error before this paper (CWG 150)
template <typename T, class... Ts, template<typename, class...> class Container>
Stream & operator<< (Stream &stream, const Container<T, Ts...>& container)