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

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

Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

Шаблон класса строк - ошибка компиляции - C++

16.07.2013, 01:07. Просмотров 389. Ответов 3
Метки нет (Все метки)

Добрый вечер. Пытаюсь выполнить упражнение с учебника. Gcc выдаёт следующее:
Bash
1
/home/ilyuha21st/Projects/qtcreator/cpp_some1/main.cpp:148: error: need 'typename' before 'String<C>::Cref' because 'String<C>' is a dependent scope
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <iostream>
#include <cstring>
 
template<class C>
class String
{
    struct Srep;
    Srep* rep;
    class Cref;
 
public:
    String();
    String(const C *);
    String(const String &);
    ~String();
    String& operator = (const String &);
    C operator[](int) const;
    Cref operator[](int);
 
    int size() const;
    const C* c_rep() const;
};
 
/************** String::Srep **************/
 
template<class C>
struct String<C>::Srep
{
    C* s;
    int sz;
    int n;
 
    Srep();
    Srep& operator = (const Srep& obj);
 
    Srep(int ssz, const C* ss)
    {
        n = 1;
        sz = ssz;
        int copy_size = sizeof(C)*sz + 1;
        s = new C[copy_size];
        memcpy(s, ss, sizeof(C)*sz);
        s[copy_size] = '\n';
    }
 
    ~Srep() { delete [] s; }
 
    Srep* get_own_copy()
    {
        return new Srep(sz, s);
    }
};
 
/*********** String::String ************/
 
template<class C>
String<C>::String()
{
    rep = new Srep(0, "");
}
 
template<class C>
String<C>::String(const C* str)
{
    int i = 0;
    for (const C* pt = str; *reinterpret_cast<const char*>(pt) != '\n'; ++pt)
    {
        ++i;
    }
    rep = new Srep(sizeof(C)*i, str);
}
 
template<class C>
String<C>::String(const String& obj)
{
    rep = obj.rep->get_own_copy();
}
 
template<class C>
String<C>& String<C>::operator = (const String& obj)
{
    if (&obj == this)
    {
        return *this;
    }
    if (rep->n == 1)
    {
        delete rep;
    }
    rep = obj.rep;
    ++rep->n;
    return *this;
}
 
template<class C>
String<C>::~String()
{
    if (--rep->n == 0)
    {
        delete rep;
    }
}
 
template<class C>
int String<C>::size() const
{
    return rep->sz;
}
 
template<class C>
const C* String<C>::c_rep() const
{
    return rep->s;
}
 
template<class C>
C String<C>::operator[](int offset) const
{
    return rep->s[offset];
}
 
/************ String::Cref *************/
 
template<class C>
class String<C>::Cref
{
    friend class String;
 
    String& s;
    int sz;
 
    Cref();
    Cref(const Cref& r) : s(r.s), sz(r.sz) {}
    Cref& operator = (const Cref& obj);
    Cref(String& ss, int ssz) : s(ss), sz(ssz) {}
 
public:
    operator C()
    {
        return s[sz];
    }
};
 
 
/************ String::String *************/
 
template<class C>
String<C>::Cref String<C>::operator[](int offset)
{
    return Cref(*this, offset);
}
 
/************* main() **************/
 
typedef String<char> string;
 
int main()
{
    string s("Hello world");
    string s2 = s;
    std::cout << s2.c_rep() << std::endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 01:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблон класса строк - ошибка компиляции (C++):

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон - C++
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают) Троллейбус и Трамвай одинаковые поля...

Ошибка компиляции (преобразование объекта класса в объект другого класса) - C++
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции... Прога преобразует доллары США в старые Британские фунты. Но...

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон" - C++
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список). При компиляции выдает...

Исправить ошибку компиляции "для использования класса шаблон требуется список аргументов шаблона" - C++
Решил создать класс List для задания двусвязного списка, и в самом начале компилятор начал ругаться на шаблон класса: error C2955:...

Ошибка при компиляции класса - C++
Добрый день всем. Пытаюсь создать класс для вывода строки на экран типа: &quot;Привет, &lt;имя&gt;, как ты?&quot; Но компилятор ругается на 25 строке и...

Ошибка компиляции абстрактного класса - C++
public: Tour(); Tour(const char *, int, float); Tour(const Tour &amp;); Tour &amp; operator = (const Tour &amp;) = delete ; ~Tour(); ...

3
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
16.07.2013, 01:17 #2
Цитата Сообщение от xtorne21st Посмотреть сообщение
/home/ilyuha21st/Projects/qtcreator/cpp_some1/main.cpp:148: error: need 'typename' before 'String<C>::Cref' because 'String<C>' is a dependent scope
Добавить typename перед String<C>::Cref (в 148 строке).
Учить английский
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.07.2013, 09:19  [ТС] #3
gray_fox, Да мне понятно что написано; мне просто показалось, что в качестве typename имеется ввиду не ключевое слово, а просто имя типа.
0
Croessmah
Эксперт CЭксперт С++
13501 / 7658 / 865
Регистрация: 27.09.2012
Сообщений: 18,844
Записей в блоге: 3
Завершенные тесты: 1
16.07.2013, 09:30 #4
Перед именами типов, которые зависят от параметра шаблона, необходим typename
1
16.07.2013, 09:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 09:30
Привет! Вот еще темы с ответами:

Шаблон класса,ошибка TEMPLATE - C++
Вечер добрый,с таким вопросом. Задание: шаблон класса &quot;однонарпавленный линейный список&quot;. И использовать его при составлении программы,...

Ошибка компиляции после объявления класса - C++
Что не так в этом коде? Писал программку, не хочет запускаться. Упростил до минимума,все равно не работает! #include &lt;iostream&gt;; ...

Ошибка wreorder при компиляции класса - C++
В общем замучался каждый раз чего-нибудь упрощать. Вот допустим есть класс ab, если попытаться запустить такой код, то выдаст кучку ошибок:...

Шаблон класса. Ошибка `undefined reference` - C++
Доброго вечера. В следующем коде описывается незамысловатый шаблон. При разгрузке кода (т.е в 3 файла : main.cpp , chab.cpp , chab.h) ,...


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

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

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