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

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

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

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

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

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

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

7
3669 / 2638 / 597
Регистрация: 08.06.2007
Сообщений: 9,125
Записей в блоге: 4
15.05.2009, 21:37 2
Описания функций должны начинаться так:
Код
template <class T>
T my3<T>::Get3x()
То есть, во-первых, должен описываться шаблон функции, а во-вторых, имя класса должно использоваться с угловыми скобками и параметрами.
0
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
15.05.2009, 21:49  [ТС] 3
Спасибо за помощь, palva.
Теперь заработало.
0
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
16.05.2009, 13:47  [ТС] 4
Продолжая разговор, наткнулся на следующий косяк, который не знаю, как исправить.
Есть два класса - 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
3669 / 2638 / 597
Регистрация: 08.06.2007
Сообщений: 9,125
Записей в блоге: 4
16.05.2009, 15:45 5
После friend class вы должны указать имя класса, но c2 это не имя класса, это имя шаблона. А в качестве имени класса нужно использовать c2<...> Далее, если вы в описании класса упоминаете другой класс, то он должен быть либо определен ранее в тексте модуля, либо описан как класс. Если пойти по второму пути, то перед определением шаблона класса c1 нужно вставить
Код
template<class T, class T2>
class c2;
Теперь уже можно внутри определения шаблона класса c1 написать
Код
friend class c2<T, T2>;
Если параметры шаблона с2 отсутствуют среди параметров основного шаблона, то надо приписать слово class, например:
Код
friend class c2<class Q, class Q2>;
Но можно опять-таки описать классы Q и Q2 предварительно перед началом шаблона c1:
Код
class Q;
class Q2;
Тогда в шаблоне можно написать короче:
Код
friend class c2<Q, Q2>;
0
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
17.05.2009, 18:01  [ТС] 6
Вот, что я хочу (см. код ниже).
Есть класс без шаблонов (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
3669 / 2638 / 597
Регистрация: 08.06.2007
Сообщений: 9,125
Записей в блоге: 4
17.05.2009, 22:48 7
Что-то у меня такое не получается. Можно, конечно, начать описание класса 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  [ТС] 8
Спасибо, palva еще раз.
Теперь без ошибок. Правда, пришлось, внедрить шаблон для одного из классов, которому они ни к чему, но это не так важно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2009, 18:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Не пойму конструкцию 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...

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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