C++ Мой первый шаблон

Хорошо, что лучше всего избежать двусмысленности здесь?

template <class T>
inline void swap(T &a, T &b)
{
    T c; c = a; a = b; b = c;
}
/* blah blah blah (inside of a function:) */
for (itv = vals.begin(); itv != vals.end(); ++itv)
{
    if (at < (*itv)) { swap(at, (*itv)); }
    if (at % (*itv) == 0) atadd = false;
}
/* blah blah blah */

Вызов со свопом также не работает, так как он говорит, что не может решить, является ли это «void swap (T &, T &)», «void std:: swap (_Ty &, _Ty &)» или ...

Кстати, itv — это вектор‹int›::iterator.

Спасибо.


person huff    schedule 01.02.2010    source источник


Ответы (1)


Проблема в том, что пространство имен std также содержит функцию swap() и выглядит так, будто у вас где-то раньше было using namespace std;, поэтому компилятор не может решить, какое использовать swap() - ваше из глобального пространства имен или из пространства имен std.

Вам нужно добавить к вызову «::», чтобы явно указать компилятору использовать ваш swap() из глобального пространства имен, а не из пространства имен std. В качестве альтернативы вы можете переименовать свою функцию swap() или не использовать using namespace std;.

person sharptooth    schedule 01.02.2010
comment
Это подводит нас к тому, зачем переопределять swap, когда он уже доступен в стандарте. - person David Rodríguez - dribeas; 01.02.2010