Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/76: Рейтинг темы: голосов - 76, средняя оценка - 4.54
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier

15.05.2009, 20:49. Показов 15111. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком.
Если я прописываю тело функций внутри описания класса - на месте - то все нормально.
Если же выношу непосредственный код отдельно, но появляются ошибки типа
1) use of class template requires template argument list
2) 'T' : undeclared identifier
Все-таки хочется в описании класса оставить только прототип функций - это же возможно.
Помогите, кто знает, а то я уже все что можно испробовал.
Вот примеры таких классов - у первого весь код внутри и все работает, у второго - отдельно, и возникают ошибки.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream.h>
 
template <class T>
class my2
{
    public:
        my2() {t = (T) 7;}
        T Get2x() {return (T) 2*t;}
    private:
        T t;
};
 
int main()
{
    my2 <int> q;
    cout << q.Get2x() << endl;
    return 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
#include <iostream.h>
 
template <class T>
class my3
{
    public:
        my3();
        T Get3x();
    private:
        T t;
};
 
my3::my3()
{
    t = (T) 7;
}
 
T my3::Get3x()
{
    return (T) 3*t;
}
 
int main()
{
    my3 <int> w;
    cout << w.Get3x() << endl;
    return 1;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2009, 20:49
Ответы с готовыми решениями:

Шаблоны: ошибки: requires template argument list или undeclared identifier
Есть маленький тестовый проект из 4-файлов. Что мне надо - рассказывать словами замучаюсь, взляните пожалуйста на код по ссылке ниже (он...

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

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

7
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
15.05.2009, 21:37
Описания функций должны начинаться так:
Code
1
2
template <class T>
T my3<T>::Get3x()
То есть, во-первых, должен описываться шаблон функции, а во-вторых, имя класса должно использоваться с угловыми скобками и параметрами.
0
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
15.05.2009, 21:49  [ТС]
Спасибо за помощь, palva.
Теперь заработало.
0
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
16.05.2009, 13:47  [ТС]
Продолжая разговор, наткнулся на следующий косяк, который не знаю, как исправить.
Есть два класса - c1 и c2. Второй (c2) наследуется от c1.
Чтобы классу c2 были доступны private члены класса c1, объявляю для c1 друга - c2.
И компилятор вываливает кучу ошибок. Если строчку
friend class c2;
закоментировать, то все нормально.
Манипуляции над этой строчкой результатов не дали, типа написать
friend class c2 <T, T2>;
friend class c2 <class T, class T2>;
дает много других ошибок, которые тоже не понятно как исправить.
Ниже привожу описанный код.
Скажите, что делать, а то я, видимо, в тупик зашел.

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
#include <iostream.h>
 
/*************************************/
 
template <class T, class T2>
class c1
{
//  friend class c2;
    public:
        T get_exp();
        T2 get_zero();
};
 
template <class T, class T2>
T c1 <T, T2>::get_exp()
{
    return (T) 2.71828;
}
 
template <class T, class T2>
T2 c1 <T, T2>::get_zero()
{
    return (T2) 0;
}
 
/*************************************/
 
template <class T, class T2>
class c2: public c1 <T, T2>
{
    public:
        T2 get_pi();
};
 
template <class T, class T2>
T2 c2 <T, T2>::get_pi()
{
    return (T2) 3.14159;
}
 
/*************************************/
 
int main()
{
    c2 <double, int> qq;
    cout << qq.get_exp() << endl;
    cout << qq.get_zero() << endl;
    cout << qq.get_pi() << endl;
    return 1;
}
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
16.05.2009, 15:45
После friend class вы должны указать имя класса, но c2 это не имя класса, это имя шаблона. А в качестве имени класса нужно использовать c2<...> Далее, если вы в описании класса упоминаете другой класс, то он должен быть либо определен ранее в тексте модуля, либо описан как класс. Если пойти по второму пути, то перед определением шаблона класса c1 нужно вставить
Code
1
2
template<class T, class T2>
class c2;
Теперь уже можно внутри определения шаблона класса c1 написать
Code
1
friend class c2<T, T2>;
Если параметры шаблона с2 отсутствуют среди параметров основного шаблона, то надо приписать слово class, например:
Code
1
friend class c2<class Q, class Q2>;
Но можно опять-таки описать классы Q и Q2 предварительно перед началом шаблона c1:
Code
1
2
class Q;
class Q2;
Тогда в шаблоне можно написать короче:
Code
1
friend class c2<Q, Q2>;
0
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
17.05.2009, 18:01  [ТС]
Вот, что я хочу (см. код ниже).
Есть класс без шаблонов (c2), который имеет друга - класс c1 <class T>, а также private-переменную intPr, которая равняется 7.
В классе c1 есть public-функция GetPr, которая должна возвращать значение intPr через созданный экземпляр класса С2 - objC2.
Заранее благодарен за помощь.

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
#include <iostream.h>
 
/*************************************/
 
template <class T>
class c1
{
    public:
        T GetPr()
        {
            return (T) objC2.intPr;
        }
    private:
        class c2 objC2;
};
 
/*************************************/
 
class c2
{
    friend class c1 <class T>;
    public:
        c2()
        {
            intPr = 7;
        }
    private:
        int intPr;
};
 
/*************************************/
 
int main()
{
    c1 <double> qq;
    cout << qq.GetPr() << endl;
    return 1;
}
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
17.05.2009, 22:48
Что-то у меня такое не получается. Можно, конечно, начать описание класса c2 так:
C++
1
2
3
4
typedef double T; 
class c2
{
    friend class c1 <T>;
Но вы хотите другого. Похоже я был не прав в предыдущем ответе. Если в описания класса встречается параметр, который замышляется использовать как параметр шаблона, то такой класс надо описывать как шаблон классов, чтобы можно было включить этот параметр, в параметры этого шаблона. В результате у меня заработало только так:
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
#include <iostream.h>
/*************************************/
template <class T>
class c2;
template <class T>
class c1
{
    public:
        T GetPr()
        {
            return (T) objC2.intPr;
        }
   private:
        c2<T> objC2;
};
/*************************************/
template <class T>
class c2
{
    friend class c1<T>;
    public:
        c2()
        {
            intPr = 7;
        }
    private:
        int intPr;
};
/*************************************/
int main()
{
    c1 <double> qq;
    cout << qq.GetPr() << endl;
    return 1;
}
0
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
19.05.2009, 18:57  [ТС]
Спасибо, palva еще раз.
Теперь без ошибок. Правда, пришлось, внедрить шаблон для одного из классов, которому они ни к чему, но это не так важно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2009, 18:57
Помогаю со студенческими работами здесь

Error: '>>' should be '>>' within a nested template argument list
кто знает че за ошибка, как с ней бороться? 000615.cpp: In function 'int main()':

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

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

Template argument required for class "LinkedListIterator"
#ifndef LINKEDLIST_H #define LINKEDLIST_H #include &lt;iostream&gt; using namespace std; template &lt;typename Type&gt; class...

Ошибка no instance of function template "Swap" matches the argument list
#include &quot;stdafx.h&quot; using namespace System; using namespace System::Collections::Generic; generic &lt;typename T&gt; void Swap(T...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 19.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru