2015-04-25 2 views
1

Я не могу понять, что двусмысленно относительно swap(arr[i++],arr[n--]); ниже. Пожалуйста, просветите меня о моих противоправных действиях.вызов перегруженного «свопа» (char &, char &) 'неоднозначен

#include <iostream> 
#include <string> 

template <typename T> void swap (T & a, T & b) 
{ 
    T temp = b; 
    b = a; 
    a = temp; 
} 

template <typename T> void reverse_array (T * arr, size_t n) 
{ 
    size_t i = 0; 
    while (i < n) swap(arr[i++],arr[n--]); // problem line 
} 


int main() 
{ 
    char mystr [] = "Obama smokes"; 
    reverse_array(mystr, sizeof(mystr)/sizeof(char)); 
    return 0; 
} 
+1

Этот код компилируется, и делает с Clang 3.5 и GCC 4.9. – chris

+0

Компиляция отлично подходит для меня. Ваша * целая * программа? – Ryan

+0

Я не могу воспроизвести ни g ++, ни MSVC. Является ли это ** реальным кодом **? –

ответ

7

codepad has an implicit using namespace std;, что это действительно плохая идея, и делает ваш swap конфликт с std::swap. Вы можете использовать ::swap вместо этого, но не раньше fixing your bounds problem, минуя sizeof mystr - 2 вместо sizeof(mystr)/sizeof(char).

+0

Что с '- 2', в отличие от' - 1', чтобы игнорировать завершающий нулевой байт? –

+1

@ Cheersandhth.-Alf: 'n' в' reverse_array', кажется, указывает индекс последнего элемента для свопинга ('n -'), а не размер области подкачки. – Ryan

0

Как упоминает @minitech в своем ответе, проблема связана с неявным объявлением пространства имен, например. using namespace std;

С этими словами я получаю следующее сообщение об ошибке, которое показывает, что конфликт с std::swap:

100%] Building CXX object CMakeFiles/csi_projects.dir/main.cpp.o 
    /home/vsnyc/ClionProjects/main.cpp: In instantiation of ‘void reverse_array(T*, size_t) [with T = char; size_t = long unsigned int]’: 
    /home/vsnyc/ClionProjects/main.cpp:151:52: required from here 
    /home/vsnyc/ClionProjects/main.cpp:144:43: error: call of overloaded ‘swap(char&, char&)’ is ambiguous 
     while (i < n) { swap(arr[i++],arr[n--]); } // problem line 
              ^
    /home/vsnyc/ClionProjects/main.cpp:144:43: note: candidates are: 
    /home/vsnyc/ClionProjects/main.cpp:134:28: note: void swap(T&, T&) [with T = char] 
    template <typename T> void swap (T & a, T & b) 
           ^
    In file included from /usr/include/c++/4.8/bits/stl_pair.h:59:0, 
        from /usr/include/c++/4.8/bits/stl_algobase.h:64, 
        from /usr/include/c++/4.8/bits/char_traits.h:39, 
        from /usr/include/c++/4.8/ios:40, 
        from /usr/include/c++/4.8/ostream:38, 
        from /usr/include/c++/4.8/iostream:39, 
        from /home/vsnyc/ClionProjects/main.cpp:1: 
    /usr/include/c++/4.8/bits/move.h:166:5: note: void std::swap(_Tp&, _Tp&) [with _Tp = char] 
     swap(_Tp& __a, _Tp& __b) 
     ^
+0

Очевидно, что GCC 4.1.2 не дал очень описательных ошибок, или Codepad просто отключил его. – chris

+0

Интересно, я использую g ++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2, и это так. Мне также нравится новая [C++ IDE] (https://www.jetbrains.com/clion/) от Jetbrains :), теперь я могу установить точки останова таким же образом, как и в Intellij – vsnyc

+0

GCC 4.1.2 был выпущен восемь много лет назад. Я не слишком удивлен сообщениями об ошибках. – chris

Смежные вопросы