Я реализовал перегрузку для симпатичных пар печати:
template<typename P>
ostream &operator<<(ostream &os, const P &p) {
using std::operator<<;
os << '(' << p.first << ", " << p.second << ')';
return os;
}
Однако в его присутствии компилятору трудно определить, следует ли ему применять стандартную перегрузку или ту, которую я определил выше, дажев случаях, когда выбор должен быть очевидным:
int main() {
cout << "SFINAE sure is hard to grasp!\n";
}
error: use of overloaded operator '<<' is
ambiguous (with operand types 'std::ostream' (aka 'basic_ostream<char>') and
'const char [30]')
Я не совсем понимаю, в чем проблема.Массив char, который я пытаюсь распечатать, явно не содержит first
или second
членов, поэтому создание его с моей перегрузкой может привести к ошибке.
Если SFINAE не попытается выполнить подстановку, найдитевыходит, что члену не хватает, и откажитесь от результата?Если нет, то почему?