Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
1

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

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

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

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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2014, 23:23
Ответы с готовыми решениями:

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

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

Ошибка с django.Template.Template
Из учебника djbook: http://djbook.ru/ch04s02.html В самом начале представлен пример использования...

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

6
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
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
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
17.03.2014, 23:47  [ТС] 3
Цитата Сообщение от John Prick Посмотреть сообщение
Специализация шаблонной функции не соответствует основному шаблону:
Да, нужно именно char*.
Аа, понял, у меня же: const char* ars[ars_size] отсылается аргументом к шаблону, поэтому и параметр должен быть const char** ar.
Спасибо!!

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

Не по теме:

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

0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
17.03.2014, 23:48 4
Лучший ответ Сообщение было отмечено andrejap как решение

Решение

Некий тип и указатель на этот тип - это разные типы. Как 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
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
17.03.2014, 23:55  [ТС] 5
Разъяснил, спасибо!
0
4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80
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
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
15.08.2016, 10:11 7
VergilYamato, если в качестве строки используется char*, то адрес этой строки - это адрес её первого символа. И для специализации надо использовать char*.
0
15.08.2016, 10:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2016, 10:11
Помогаю со студенческими работами здесь

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

Template definition of non-template при использовании частичной спецификации шаблонов
Всем привет! Есть задача написать шаблон класса, принимающего в качестве параметров типа шаблон и...

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru