Форум программистов, компьютерный форум 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. Просмотров 3339. Ответов 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;
}
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++ подскажите template<class> (Шаблоны и указатели)
template <class T> C++
Error: '>>' should be '>>' within a nested template argument list C++
C++ list iterator template
C++ Ошибка: error C2783: 'T __cdecl sumF(void)' : could not deduce template argument for 'T'
C++ MSVC и template template classes
C++ Специализация nested template class
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
2508 / 1730 / 229
Регистрация: 08.06.2007
Сообщений: 6,787
Записей в блоге: 4
15.05.2009, 21:37     Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier #2
Описания функций должны начинаться так:
Код
template <class T>
T my3<T>::Get3x()
То есть, во-первых, должен описываться шаблон функции, а во-вторых, имя класса должно использоваться с угловыми скобками и параметрами.
kimsite
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
15.05.2009, 21:49  [ТС]     Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier #3
Спасибо за помощь, palva.
Теперь заработало.
kimsite
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
16.05.2009, 13:47  [ТС]     Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier #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;
}
palva
2508 / 1730 / 229
Регистрация: 08.06.2007
Сообщений: 6,787
Записей в блоге: 4
16.05.2009, 15:45     Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier #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>;
kimsite
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
17.05.2009, 18:01  [ТС]     Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier #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;
}
palva
2508 / 1730 / 229
Регистрация: 08.06.2007
Сообщений: 6,787
Записей в блоге: 4
17.05.2009, 22:48     Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2009, 18:57     Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Еще ссылки по теме:

C++ Template class
как убрать template< class T > C++
Ошибка "template argument 1 is invalid" C++
C++ Template argument required for class "LinkedListIterator"
Ошибка с template <class T> C++

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

Или воспользуйтесь поиском по форуму:
kimsite
1 / 1 / 0
Регистрация: 24.07.2007
Сообщений: 178
19.05.2009, 18:57  [ТС]     Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier #8
Спасибо, palva еще раз.
Теперь без ошибок. Правда, пришлось, внедрить шаблон для одного из классов, которому они ни к чему, но это не так важно.
Yandex
Объявления
19.05.2009, 18:57     Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Ответ Создать тему
Опции темы

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