Я изучал шаблоны и пытался с ними что-то программировать.Недавно я наткнулся на странное поведение, которое я пытаюсь обобщить здесь.Предположим, у нас есть следующий заголовочный файл MyHeader.H
class Dit{...};
class B{...};
class A{
...
B & operator[] (Dit & it){...};
...
};
template <T> bar(T& t){
static_assert(!std::is_same(T,A)::value," in bar, T cannot be of type A");
...
};
и основная функция
include "MyHeader.H"
foo(B & b){...};
foo(int t){...};
int main() {
A a;
Dit it;
foo(a[it]); // the compiler has no problem in selecting the right overloaded foo
bar(a[it]); // the compiler tries to instantiated it with type A, and because of the static_assert, it fails.
return 0;
}
Почему компилятор ищет определение bar(A a)
, учитывая, что a[it]
типа B
?Я еще не пробовал, но будет ли это иметь значение, если я буду использовать
bar<B>(a[it]);
?Конечно, если я сделаю
B & temp=a[it];
bar(temp);
, все будет хорошо.