В функции main () я хочу вызвать метод1, а не метод2.Как мне этого добиться?Спасибо за чтение
И это именно то, что вы называете
obj.GetVal(false)
, потому что false
- это bool
, так что это точное соответствие для метода не-шаблона.И когда вызов соответствует методу шаблона и методу, не являющемуся шаблоном, метод не-шаблона (в случае совпадения точный ) предпочтителен.
Настоящая проблема заключается в следующем: как вызватьmethod2 вызывает его с типом (bool
) не шаблонного метода (метод 1)?
Ответ (возможный ответ): добавить template
, вызывая его
obj.template GetVal(false)
Ниже приведен полный рабочий пример
#include <iostream>
struct A
{
//Lets call this method 1
int GetVal (bool)
{ return 1; }
//Lets call this method 2
template <typename T>
int GetVal (T)
{ return 2; }
};
int main ()
{
A obj;
std::cout << obj.GetVal(false) << std::endl; // print 1
std::cout << obj.template GetVal(false) << std::endl; // print 2
}
- РЕДАКТИРОВАТЬ -
Учитывая, что ОП точно указывает, что метод 1 равен const
(иметод 2 - нет), метод 2 стал лучше.
Проблема может быть решена путем изменения A
, как в ответе Jarod42 (добавление неконстантного не шаблонного метода, который вызывает метод const или SFINAE).отключение метода шаблона 2, когда T
равен bool
) или как в ответе Wanderer (делая const
также метод 2).
Но если вы этого не сделаете (или если вы не можете)изменить класс A
, вы можете просто использовать static_assert()
непосредственно в main()
std::cout << static_cast<A const &>(obj).GetVal(false) << std::endl;