Ich habe eine Funktionsvorlage zum Drucken einiger STL-Container erstellt
#include <iostream>
#include <vector>
#include <string>
template <template <typename, typename> class C, typename T, typename A>
std::ostream& operator<<(std::ostream& os, const C<T, A>& container)
{
for (auto& elem : container)
{
os << elem << " ";
}
return os;
}
int main()
{
std::vector<std::string> v { "One", "Two", "Three" };
std::cout << v << std::endl;
return 0;
}
Dies kompiliert und funktioniert wie erwartet unter MSVC, Clang und ICC, aber beim Kompilieren mit GCC (Trunk) wird ein mehrdeutiger operator<<
Fehler für die Leitung ausgegeben os << elem << " "
. Und selbst dieser Fehler tritt nur beim Kompilieren mit dem Flag -std=c++17
oder auf -std=c++2a
.
Der Fehler erscheint vernünftig, std::string
da der Compiler eine vorhandene Funktionsvorlage erkennt, die für global operator<<
einen Ausgabestream und a akzeptiert basic_string<CharT, Traits, Allocator>
, wobei der Allocator
Typ standardmäßig verwendet wird std::allocator
.
Meine Frage wäre, warum es kompiliert und mit den anderen 3 Compilern zusammenarbeitet. Nach meinem Verständnis verwendet Clang unter Linux dieselbe Standardbibliotheksimplementierung wie gcc, sodass es dieselbe Funktionsvorlage für das hat operator<<
Der gemeldete Fehler ist
error: ambiguous overload for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'const std::__cxx11::basic_string<char>')
Und die beiden Kandidaten
note: candidate: 'std::ostream& operator<<(std::ostream&, const C<T, A>&) [with C = std::__cxx11::basic_string; T = char; A = std::char_traits<char>; std::ostream = std::basic_ostream<char>]'
note: candidate: 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::__cxx11::basic_string<_CharT, _Traits, _Allocator>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]'
Compiler-Argumente für GCC, Clang und ICC
-std=c++2a -O3 -Wall -Wextra -Wpedantic -Werror
Ein für MSVC
/std:c++latest /O2 /W3
Obligatorischer Godbolt-Link: https://godbolt.org/z/R_aSKR