Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gcc和c+的重载解析失败+;17_C++_Gcc_C++17 - Fatal编程技术网

C++ gcc和c+的重载解析失败+;17

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(9.2)和c++17进行编译。它可以与clang和MSVC一起工作,也可以与c++14一起工作。发生了什么,谁是对的,有没有简单的解决办法?求助于
#定义
为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)