2014-02-14 2 views
0

Я пытаюсь поменять местами две точки на const char с помощью реального вызова по ссылке. Но у меня проблемы.Переключение двух указателей на char в C++ по реальному вызову по ссылке

void swap(const char *&str1, const char *&str2) { //swap char pointers 
    const char *one = str1; 
    str1 = str2; 
    str2 = one; 
} 

int main(void){ 
    const char *str1 = "Apple"; 
    const char *str2 = "Potato"; 
    swap(*str1, *str2); 
    return 0.0; 
} 

Я продолжаю получать эту ошибку:

invalid conversion from 'char' to 'const char'

+2

'swap (str1, str2);' – BoBTFish

+0

по-прежнему получают ту же ошибку – jason

+5

@ user2678614: Нет, вы этого не сделаете. –

ответ

3

Вы не должны быть разыменовывает указатели при вызове swap. Вам нужно позвонить:

swap(str1, str2); 

Или, еще лучше, используйте std::swap.

Кроме того, если вы пытаетесь запустить код, который вы написали они вам нужно либо прототип swap или поменять местами функции вокруг:

void swap(const char *&str1, const char *&str2) 
{ 
    const char *one = str1; 
    str1 = str2; 
    str2 = one; 
}  

int main(void) 
{ 
    const char *str1 = "Apple"; 
    const char *str2 = "Potato"; 
    swap(str1, str2); 

    return 0; 
} 

Кроме того, main возвращает Int, а не плавать

+0

я изменил это, спасибо. Но все же у меня такая же проблема. – jason

+0

Также просто используйте 'std :: swap()' (в '') вместо того, чтобы писать свою собственную функцию свопинга. Вот для чего это. – TypeIA

+0

Это было задание (чтобы сделать функцию свопинга), поэтому я не могу сделать это напрямую. Можете ли вы помочь мне с любой ошибкой, которую вы видите? – jason

3

Вы должны использовать std::swap (расположенный в любом заголовке <algorithm> или <utility>) вместо того, чтобы добавить собственные:

std::swap(str1, str2); 

Кроме того, следует рассмотреть возможность использования std::string вместо const char* в целом:

std::string str1 = "Apple"; 
std::string str2 = "Potato"; 

конечно алгоритм std::swap все равно будет работать нормально.

И, наконец, ни один void в списке аргументов main и return 0.0 не нужны в C++.

Вот код повторно с вышеуказанными советами:

#include <algorithm> 
#include <string> 
#include <iostream> 

int main() { 
    std::string str1 = "Apple"; 
    std::string str2 = "Potato"; 
    std::swap(str1, str2); 
} 

и here «s живой пример.


В ответ г-н Cthulhu вниз здесь, я постараюсь ответить на этот вопрос более четко.

Ваша ошибка вызвана тем, что с помощью разыменования указателей типа const char* вы фактически получаете выражение типа const char& которое, очевидно, несовместимо с типом, выраженным в вашей swap функции. Вот правильный вызов функции:

swap(str1, str2); 

Но опять же, почему тиражирование код std::swap? (Это риторический вопрос, в случае, если вам интересно, кастрированный баран, чтобы пометить это как «не ответ»)

+0

Теперь это что-то новое. Кто скажет мне, что я не могу создать свою собственную функцию, если ее функциональный эквивалент уже существует в какой-то библиотеке? В любом случае, не отвечает на исходный вопрос. – Cthulhu

+0

@Cthulhu, принцип программирования DRY (Do not Repeat Yourself) говорит об этом. Возможно, вы не знакомы с этой концепцией. – Shoe

+2

@Cthulhu: Все эксперты. Это ничего «нового» вообще. –

0

Вы определяете swap()после вы звоните его. В C++ функции должны быть определены до их вызова. Переместите определение swap() в начало файла, выше main().После этого вы получите эту ошибку:

test.cpp:11: warning: converting to ‘int’ from ‘double’ 

Ваша main() функция должна возвращать 0 (int), не 0.0 который является double.

Установка этого, вы, наконец, получите эту ошибку:

test.cpp: In function ‘int main()’: 
test.cpp:10: error: invalid initialization of reference of type ‘const char*&’ from expression of type ‘const char’ 
test.cpp:1: error: in passing argument 1 of ‘void swap(const char*&, const char*&)’ 

Это потому, что вы разыменования ваши аргументы swap(). Удалите *, и программа теперь отлично работает.

Однако, вы должны просто удалить swap() функцию в целом, #include <utility>, и использовать std::swap().

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