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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.85
kimsite
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
#1

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

15.05.2009, 20:49. Просмотров 3521. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2009, 20:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier (C++):

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

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

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

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

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

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

7
palva
2630 / 1857 / 268
Регистрация: 08.06.2007
Сообщений: 7,097
Записей в блоге: 4
15.05.2009, 21:37 #2
Описания функций должны начинаться так:
Код
template <class T>
T my3<T>::Get3x()
То есть, во-первых, должен описываться шаблон функции, а во-вторых, имя класса должно использоваться с угловыми скобками и параметрами.
0
kimsite
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
15.05.2009, 21:49  [ТС] #3
Спасибо за помощь, palva.
Теперь заработало.
0
kimsite
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
palva
2630 / 1857 / 268
Регистрация: 08.06.2007
Сообщений: 7,097
Записей в блоге: 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
kimsite
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
palva
2630 / 1857 / 268
Регистрация: 08.06.2007
Сообщений: 7,097
Записей в блоге: 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
kimsite
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
19.05.2009, 18:57  [ТС] #8
Спасибо, palva еще раз.
Теперь без ошибок. Правда, пришлось, внедрить шаблон для одного из классов, которому они ни к чему, но это не так важно.
0
19.05.2009, 18:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2009, 18:57
Привет! Вот еще темы с ответами:

Ошибка компиляции: template-id does not match any template declaration - C++
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; T maxn(T*, const int*); ...

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

Template class - C++
Возможно ли разделить шаблонный класс на два файла так, что в одном из файлов буду объявления, а в другом определения членов класса? ...

template <class T> - C++
Куда вставлять template &lt;class T&gt; при определении функций, принимающих аргументы типа &quot;класс&quot;?дружественных фунгкций и вообще куда её...


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

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

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