考虑以下代码:
#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;
}
g++ 和 clang 都接受该代码(并使用该vector
版本)。
另一方面,MSVC 拒绝该代码,并指出:
<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>>)'
MSVC 拒绝这个是否不正确?我该如何解决这个问题? Godbolt Link
注意:我可以使用sql.operator<<( temp );
,但当有很多东西被连接在一起时,这并不好。