Если вы полностью просмотрите ошибку компиляции, вы увидите, почему. Вот что GCC 5.2 дает мне:
main.cpp: In function 'int main()':
main.cpp:10:21: error: call of overloaded 'max(int, int)' is ambiguous
cout << max(3, 7) << std::endl;
^
main.cpp:4:3: note: candidate: T max(T, T) [with T = int]
T max(T x, T y)
^
In file included from /usr/local/include/c++/5.2.0/bits/char_traits.h:39:0,
from /usr/local/include/c++/5.2.0/ios:40,
from /usr/local/include/c++/5.2.0/ostream:38,
from /usr/local/include/c++/5.2.0/iostream:39,
from main.cpp:1:
/usr/local/include/c++/5.2.0/bits/stl_algobase.h:219:5: note: candidate: constexpr const _Tp& std::max(const _Tp&, const _Tp&) [with _Tp = int]
max(const _Tp& __a, const _Tp& __b)
^
В принципе, есть две max
функции - ваши и std::max
, занесенная некоторой цепь других #include
с от <iostream>
. Последнее определяется путем поиска из-за вашего
using namespace std;
Эффективно, мы имеем:
template <typename T> T max(T, T); // yours
template <typename T> T const& max(T const&, T const&); // std
Ни лучше, чем другие, следовательно, неоднозначен. Это отличная причина для avoid using namespace std
. Или отличная причина не изобретать колесо, когда речь идет о стандартных библиотечных функциях - просто используйте std::max
. Или оба.
С другой стороны, это один
max(3, 7.0)
потерпит неудачу, независимо как отказ шаблона дедукции. Это выведет T
как int
для первого аргумента, а T
- double
для второго - но может быть только один T
! Вам нужно будет явно позвонить либо max<int>(3, 7.0)
, либо max<double>(3, 7.0)
, чтобы обойти ошибку дедукции, в зависимости от того, какой из двух аргументов вы хотите применить.
Повторите попытку без использования пространства имен std для удаления источника путаницы. – juanchopanza
@juanchopanza все тот же .. –
Сделайте это в любом случае. Исправьте свой код и опубликуйте сообщение об ошибке. – juanchopanza