Вот немного кода:шаблон функции перегрузки с сопзЬ
template<class T>
inline void bar(T& t) {
foo(t); // intention is that foo() is found by ADL
}
struct Wig {
int i;
};
void foo(int){ }
// some convenience overload
inline void bar(const Wig& w) { foo(w.i); }
// The bit that if uncommented, "fixes" the problem
//inline void bar(Wig& w) { foo(w.i); }
int main()
{
Wig w;
bar(w);
return 0;
}
Clang 3,5 и 4,7 Gcc, выплюнуть следующее сообщение об ошибке:
template-function-overload.cpp:12:4: error: no matching function for call to 'foo'
foo(t);
^~~
template-function-overload.cpp:29:4: note: in instantiation of function template specialization
'bar<Wig>' requested here
bar(w);
^
template-function-overload.cpp:19:6: note: candidate function not viable: no known conversion from
'Wig' to 'int' for 1st argument
void foo(int){ }
^
Так это не выглядит как компилятор вопрос.
Также, комментируя неконстантную перегрузку, исправлена ошибка.
Почему этот код не используется, и почему требуется неконстантная перегрузка?
Перед тем, как позвонить, вам нужно объявить 'foo'. – juanchopanza
Это неверно для контекста шаблона, и не работает ADL. А также обратите внимание, что при неконстантной перегрузке код является законным. – Nick
Неважно. Вы это прекрасно понимаете. – juanchopanza