У меня есть 2 класса, которые оба имеют шаблонные конструкторы с одним аргументом. Один предназначен для перехвата всех типов целых чисел, а в другом классе он предназначен для связывания любого итерируемого объекта. У меня есть две перегрузки для конкретной функции, которая будет каждый из этих типов. Если я вызываю функцию с целочисленным типом, или строкой, или чем-то, что будет работать как минимум для одного классов, я получаю ошибку о неоднозначности вызова.
#include <string>
class A {
public:
template <typename Iterable>
A(Iterable it) : s(it.begin(), it.end()) {}
private:
std::string s;
};
class B {
public:
template <typename Integer>
B(Integer i) : i(i + 1) {}
private:
int i;
};
void Use(A a)
{
// some thing
}
void Use(B b)
{
// some other thing
}
int main(void)
{
Use(0);
return 0;
}
Компилятор, похоже, недостаточно углубляется в набор полиморфизмов, чтобы определить, что на самом деле существует только одно возможное решение. Может ли это быть из-за того, что шаблон «разрешается» до перегрузки функции? Как мне помочь компилятору?