#c #types #prototype #compiler-errors
#c #типы #прототип #ошибки компилятора
Вопрос:
РЕДАКТИРОВАТЬ 23.11.2011 9:37 вечера:
Это моя ошибка:
error: no matching function for call to "charList_join(const char [1], CISP430_A5::linked_list<char>amp;)"
и это мой прототип:
template <typename Item>
string charList_join(const char* glue, linked_list<char> pieces);
и это мой вызов функции:
charList_join("", usedChars)
где usedChars — это a static linked_list<char>
, объявленный в той же области, где charList_join()
вызывается.
РЕДАКТИРОВАТЬ 4.11.2011 8:45 утра: Хорошо, итак, вот мой код с удаленными ненужными функциями:
[sehe: отредактировано из pastebin в github]
- просмотрите его онлайн на github
-
загрузите его с помощью git:
git clone git://gist.github.com/1340832.git
Я получаю сообщение об ошибке в строке 57, столбец 68 из premute_append.cpp . Я включил makefile, чтобы вы могли попытаться создать его, если хотите. На данный момент я получаю только одну ошибку, но я просто понятия не имею, что это значит.
Если вы попытаетесь скомпилировать ошибку, она будет выглядеть так:
[cisw320b_stu022@scc-bdiv-cis assn5]$ make
g -c main.cpp
g -c permute_append.cpp
permute_append.cpp: In member function âCISP430_A5::linked_list<std::basic_string<char> > CISP430_A5::permute_append::permute(CISP430_A5::linked_list<char>)â:
permute_append.cpp:57:68: error: no matching function for call to âcharList_join(const char [1], CISP430_A5::linked_list<char>amp;)â
make: *** [permute_append.o] Error 1
Есть идеи, почему я получаю эту ошибку?
Комментарии:
1. Опубликуйте sscce . Эта ошибка, скорее всего, вызвана реализацией
linked_list
, но трудно найти причину этого без полной программы, которая воспроизводит ошибку.2. Исправляет ли изменение прототипа на:
string charList_join(const char* glue, CISP430_A5::linked_list<char> pieces);
проблему?3. @Mankarse Я пробовал, но это не сработало.
4. Эй, я тоже пробовал это, но ошибка идентична.
5. Хммм… Довольно сложно предоставить sscce, потому что фактический код довольно длинный.
Ответ №1:
Вы сказали:
и это мой прототип:
string charList_join(const char* glue, linked_list<char> pieces);
Но это не так. Согласно предоставленному вами коду, ваше объявление:
template <typename Item>
string charList_join(const char* glue, linked_list<char> pieces);
Это означает, что вам нужно назвать это так:
charList_join<char>("", usedChars)
Однако на самом деле вы не используете Item
эту функцию, поэтому вам следует просто удалить template
спецификатор (из объявления и определения) и вызвать его так, как вы были. А еще лучше, передайте список по const-reference:
string charList_join(const char* glue, const linked_list<char>amp; pieces);
Вызов остается:
charList_join("", usedChars)
Комментарии:
1. Упс, это была опечатка. Я хотел указать возвращаемый тип.
2. Вы сделали. Теперь, когда он не имеет никакого сходства с тем, который вы спросили, я могу удалить этот ответ.
3. Вы снова обновились. Теперь я могу ответить, просмотрев много ненужного кода.
4. Спасибо! Вы и K-ballo оба ответили одним и тем же ответом, но он ответил первым, поэтому я дал его ему. Спасибо, спасибо, спасибо!
Ответ №2:
string charList_join(const char* glue, linked_list<char> pieces);
на самом деле
template< typename Item >
string charList_join(const char* glue, linked_list<char> pieces);
Поскольку Item
не обнаружено ни в одном из аргументов, вы должны передать его явно:
charList_join<SomeItemType>( "", usedChars);
Или, возможно, вы просто хотели вместо этого:
template< typename Item >
string charList_join(const char* glue, linked_list<Item> pieces);
Комментарии:
1. Действительно, при использовании
charList_join<SomeItemType>( "", usedChars);
ошибка исчезла! Думаю, мне нужно подробнее ознакомиться с шаблонами. ИтакcharList_join<someType>
, устанавливает тип дляItem
? Означает ли это, что все виды использованияItem
должны быть ограниченыsomeType
сейчас?2. @trusktr: он задает тип
Item
внутри функции, а не во вложенииclass
. Кажется, что большинство, если не все функции шаблона, должны быть просто обычными функциями. Продолжайте изучать шаблоны!3. Спасибо! Итак, я узнал, что префикс шаблона не является необходимым, если типы данных не являются неоднозначными!
4. @trusktr: Да, большинство, если не все, из-за неправильного понимания шаблонов выглядят как искусственная рябь. Функции-члену шаблона класса не обязательно включать
template<>
префикс, поскольку он уже неявен для его типа класса, это нужно делать только в том случае, если он действительно предназначен для работы с самим семейством типов.5. @trusktr: посмотрите простой учебник по спискам с использованием шаблонов, и вы поймете, как это должно быть сделано. Существует множество примеров. Существует также реализация стандартной библиотеки, но обычно ее слишком сложно читать из-за стандартных ограничений.