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

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

Восстановить пароль Регистрация
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
17.03.2014, 23:23     Ошибка компиляции: template-id does not match any template declaration #1
Здравствуйте. Помогите, пожалуйста:

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
Сборка завершилась с ошибкой.


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

ошибка: friend declaration declares a non-template function C++
Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier C++
<Template>. Ошибка компиляции C++
C++ MSVC и template template classes
C++ Не пойму конструкцию template <template <class T> class X>
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
17.03.2014, 23:37     Ошибка компиляции: template-id does not match any template declaration #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)
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
17.03.2014, 23:47  [ТС]     Ошибка компиляции: template-id does not match any template declaration #3
Цитата Сообщение от John Prick Посмотреть сообщение
Специализация шаблонной функции не соответствует основному шаблону:
Да, нужно именно char*.
Аа, понял, у меня же: const char* ars[ars_size] отсылается аргументом к шаблону, поэтому и параметр должен быть const char** ar.
Спасибо!!

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

Не по теме:

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

John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
17.03.2014, 23:48     Ошибка компиляции: template-id does not match any template declaration #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 должен стоять тип, указанный в <> в специализации.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
17.03.2014, 23:55  [ТС]     Ошибка компиляции: template-id does not match any template declaration #5
Разъяснил, спасибо!
VergilYamato
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 38
15.08.2016, 03:34     Ошибка компиляции: template-id does not match any template declaration #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];
}
всё ещё вызывает ту же самую ошибку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2016, 10:11     Ошибка компиляции: template-id does not match any template declaration
Еще ссылки по теме:

C++ Template, в чем ошибка?
Ошибка с template <class T> C++
'MyQueue' : use of class template requires template argument list C++

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

Или воспользуйтесь поиском по форуму:
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
15.08.2016, 10:11     Ошибка компиляции: template-id does not match any template declaration #7
VergilYamato, если в качестве строки используется char*, то адрес этой строки - это адрес её первого символа. И для специализации надо использовать char*.
Yandex
Объявления
15.08.2016, 10:11     Ошибка компиляции: template-id does not match any template declaration
Ответ Создать тему
Опции темы

Текущее время: 14:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru