Как мне правильно использовать шаблоны? У меня проблема с типом данных с шаблоном

#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: посмотрите простой учебник по спискам с использованием шаблонов, и вы поймете, как это должно быть сделано. Существует множество примеров. Существует также реализация стандартной библиотеки, но обычно ее слишком сложно читать из-за стандартных ограничений.