Разное поведение компилятора c ++ при поиске перегруженных и шаблонных функций - PullRequest
0 голосов
/ 07 декабря 2018

Я изучал шаблоны и пытался с ними что-то программировать.Недавно я наткнулся на странное поведение, которое я пытаюсь обобщить здесь.Предположим, у нас есть следующий заголовочный файл 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); 

, все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...