У меня есть этот шаблон класса:
template<class Q, class V>
bool EQ(const Q& q, V v) {
return q.Eq(v);
}
и этот класс:
struct TEq01 {
char n1;
TEq01(const void* p) : n1(*(char*)p) { }
bool Eq(char n) const { return n1 == n; }
};
Скажем, я использую это так — только указав первый параметр шаблона
char *sz = "some string";
bool f = EQ<TEq01>(sz, '1');
Как компилятор знает, что TEq01 класс Q вместо класс V? Я пользуюсь visual studio 2013.
Мне просто интересно, как компилятор знает, что TEq01 — это класс Q вместо класса V? Я пользуюсь visual studio 2013.
первый аргумент шаблона вы предоставляете первый параметр шаблона.
Порядок параметров шаблона сохраняется.
Так как вы написали:
template<class Q, class V>
bool EQ...
призвание EQ<TEq01>
средства «Q
является TEq01
а также V
не был поставлен, поэтому он должен быть выведен «.
Это шаблонная функция. Шаблоны функций получают типы аргументов независимо от того, что они передают. Возможность указывать типы в стрелках — необязательная вещь, которую вам не нужно использовать, если только вы не пытаетесь форсировать использование определенного типа.
Когда вы указываете типы в стрелках, компилятор идет по порядку, 1, 2, 3. Любые типы, которые вы не установили явно, берут типы из аргументов функции.