В настоящее время у меня есть шаблон функции, использующий ссылку, которая делает что-то по существу эквивалентное:
template <typename T>
void f(T& t)
{
t = T();
}
Теперь я могу позвонить:
int a;
f(a);
Для инициализации моей переменной a.
Я даже могу сделать:
std::vector<int> a(10);
f(a[5]);
Однако это не удастся:
std::vector<bool> a(10);
f(a[5]);
Причина в том, что a[5]
возвращает объект со ссылочной семантикой, но не со ссылкой. Поэтому мне нужно уметь написать:
template <typename T>
void f(T a)
{
a = T();
}
Но если я добавлю этот новый шаблон и попытаюсь скомпилировать первый пример (с помощью int), я получу следующую ошибку:
test_multi_tmpl.cc: In function ‘int main()’:
test_multi_tmpl.cc:20: error: call of overloaded ‘f(int&)’ is ambiguous
test_multi_tmpl.cc:6: note: candidates are: void f(T&) [with T = int]
test_multi_tmpl.cc:12: note: void f(T) [with T = int]
Есть идеи, как это решить? Я не хотел бы перегружать f
только для std::vector<bool>::reference
, поскольку эта конструкция может появляться в других местах ...