Considere o seguinte código:
#include <vector>
#include <iostream>
struct MySqlStream {
template<class T>
MySqlStream &operator<<( const std::vector<T> &values ) {
std::cout << "vector";
return *this;
}
};
template<class T>
MySqlStream &operator<<( MySqlStream &m, const T &x ) {
std::cout << "template";
return m;
}
int main() {
std::vector<double> temp;
MySqlStream sql;
sql << temp;
}
Tanto o g++ quanto o clang aceitam o código (e usam a vector
versão).
O MSVC, por outro lado, rejeita o código afirmando:
<source>(23): error C2593: 'operator <<' is ambiguous
<source>(6): note: could be 'MySqlStream &MySqlStream::operator <<<double>(const std::vector<double,std::allocator<double>> &)'
<source>(13): note: or 'MySqlStream &operator <<<std::vector<double,std::allocator<double>>>(MySqlStream &,const T &)'
with
[
T=std::vector<double,std::allocator<double>>
]
<source>(23): note: while trying to match the argument list '(MySqlStream, std::vector<double,std::allocator<double>>)'
O MSVC está incorreto ao rejeitar isso? Como eu poderia contornar isso? Godbolt Link
Observação: posso usar sql.operator<<( temp );
, mas isso não é muito bom quando há muitas coisas concatenadas.