Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
#1

Ошибка компиляции: template-id does not match any template declaration - C++

17.03.2014, 23:23. Просмотров 827. Ответов 6
Метки нет (Все метки)

Здравствуйте. Помогите, пожалуйста:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
using namespace std;
 
template <typename T>
T maxn(T*, const int*);
 
template <>
char* maxn<char*>(char*, const int*);
 
int main(int argc, char **argv)
{
    //test arrays:
    const int ari_size = 6;
    int ari[ari_size] = {7, 11, 7, 9, 9, 21};
    const int ard_size = 4;
    double ard[ard_size] = {4.1, 0.01, 71.9, 43};
    const int ars_size = 5;
    const char* ars[ars_size] = {
        "Jammy house",
        "Extraterrestial intelligence",
        "Generally electrical",
        "Free Kenny",
        "Central substance"
    };
    
    return 0;
}
 
template <typename T>
T maxn(const T* ar, const int* limit) {
    T curmax = 0, absmax = 0;
    for (int i = 1; i < *limit; ++i)
        if (ar[i] > ar[i-1]) {
            curmax = ar[i];
            if (curmax > absmax)
                absmax = curmax;
        }
    return absmax;
}
 
template <>
char* maxn<char*>(char* ar, const int* limit) {
    int curmax = 0, absmax = 0, max_ind = 0;
    for (int i = 0; i < *limit; ++i) {
        while (ar[i][j] != '\0')
            ++j;
        if (j > curmax) {
            curmax = j;
            if (curmax > absmax) {
                absmax = j;
                max_ind = i;
            }
        }
    }
    return ar[max_ind];     
}
Вот что выдал компилятор:
g++ -Wall -c "main.cxx" (в каталоге: /home/drew/Документы/dev/c++/Stephen Prata/8.6)
main.cxx:9:7: ошибка: template-id «maxn<char*>» for «char* maxn(char*, const int*)» does not match any template declaration
main.cxx: В функции «int main(int, char**)»:
main.cxx:15:6: предупреждение: неиспользуемая переменная «ari» [-Wunused-variable]
main.cxx:17:9: предупреждение: неиспользуемая переменная «ard» [-Wunused-variable]
main.cxx:19:14: предупреждение: неиспользуемая переменная «ars» [-Wunused-variable]
main.cxx: At global scope:
main.cxx:43:7: ошибка: template-id «maxn<char*>» for «char* maxn(char*, const int*)» does not match any template declaration
Сборка завершилась с ошибкой.


Только учу сейчас шаблоны и специализации, поэтому не могу разобраться с ошибками (с предупреждениями там все ясно).
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2014, 23:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка компиляции: template-id does not match any template declaration (C++):

Ошибка: friend declaration declares a non-template function - C++
Всем доброго времени суток! Я корплю над задачкой: нада сделать класс вектор шаблонным, перегрузить операции ввода-вывода, и тд и тп. ...

<Template>. Ошибка компиляции - C++
Пытаюсь сделать Темплате Array, который бы принимал класс Point. Объект класса Point состоит из 2х точек координаты x и y. Мне надо...

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier - C++
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я прописываю тело функций внутри описания...

Error: template declaration of (Code::Blocks) - C++
Помогите побороть ошибки. Код:#include &lt;cstdlib&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; ...

'MyQueue' : use of class template requires template argument list - C++
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки 'MyQueue' : use of class template...

В чем различие template <typename T> от template <class T> ? - C++
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

6
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
17.03.2014, 23:37 #2
Специализация шаблонной функции не соответствует основному шаблону:
C++
1
2
3
4
5
6
template <typename T>
T maxn(const T* ar, const int* limit)
/* .... */
template <>
char* maxn<char*>(char* ar, const int* limit)
/* ... */
В специализации вместо T просто поставь char. Тогда получится:
C++
1
2
template <>
char maxn<char>(const char* ar, const int* limit)
Добавлено через 1 минуту
Либо, если нужен именно char*:
C++
1
2
template <>
char* maxn<char*>(const char** ar, const int* limit)
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
17.03.2014, 23:47  [ТС] #3
Цитата Сообщение от John Prick Посмотреть сообщение
Специализация шаблонной функции не соответствует основному шаблону:
Да, нужно именно char*.
Аа, понял, у меня же: const char* ars[ars_size] отсылается аргументом к шаблону, поэтому и параметр должен быть const char** ar.
Спасибо!!

Добавлено через 6 минут

Не по теме:

Ну, всмысле, будет отсылаться (там еще не реализовано).

0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
17.03.2014, 23:48 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Некий тип и указатель на этот тип - это разные типы. Как int и string, к примеру.
Если в шаблоне написано
C++
1
2
template<typename T>
T func(T t)
то специализация не может быть такой, к примеру:
C++
1
2
3
4
5
template<>
char func<char>(char* t)
 
template<>
int func<int>(string t)
а везде, вместо T должен стоять тип, указанный в <> в специализации.
0
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
17.03.2014, 23:55  [ТС] #5
Разъяснил, спасибо!
0
VergilYamato
3 / 2 / 0
Регистрация: 22.08.2014
Сообщений: 63
15.08.2016, 03:34 #6
Тоже решаю это задание и столкнулся с такой сложностью: по условию специализация должна возвращать адрес первой максимальной по длине строки в массиве, то есть, тип возвращаемого значения должен быть char**, однако, судя по написанному здесь, тип возвращаемого значения для специализации должен быть char*. Если поменять специализацию на char**, то получается, что аргумент функции нужно менять с char** на char***? По крайней мере, вариант
C++
1
2
3
4
5
template <> char** maxn<char**>(char **ar, int n)
{
...
    return &ar[index_of_max_length_string];
}
всё ещё вызывает ту же самую ошибку.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
15.08.2016, 10:11 #7
VergilYamato, если в качестве строки используется char*, то адрес этой строки - это адрес её первого символа. И для специализации надо использовать char*.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2016, 10:11
Привет! Вот еще темы с ответами:

Visual Studio выдаёт ошибку при вынесении объявления функции с template в .h файл. Без template всё работает - C++
Проект содержит три файла: Source.cpp, arrTreat.h, arrTreat.cpp. Source.cpp: #include &lt;iostream&gt; using std::cout; using...

MSVC и template template classes - C++
Приветствую. Как в MSVC передать template template класс? Простой пример template&lt;template&lt;typename, typename&gt; class Return&gt; ...

Friend template class with template class argument - C++
Помогите подружить 2 класса: Имеется класс Student: template &lt;class _T&gt; class Faculty; class Student{ friend...

Не пойму конструкцию template <template <class T> class X> - C++
Что это за шаблон такой?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
15.08.2016, 10:11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru