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

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

Восстановить пароль Регистрация
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.07.2013, 01:07     Шаблон класса строк - ошибка компиляции #1
Добрый вечер. Пытаюсь выполнить упражнение с учебника. 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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 строке).
Учить английский
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.07.2013, 09:19  [ТС]     Шаблон класса строк - ошибка компиляции #3
gray_fox, Да мне понятно что написано; мне просто показалось, что в качестве typename имеется ввиду не ключевое слово, а просто имя типа.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
16.07.2013, 09:30     Шаблон класса строк - ошибка компиляции #4
Перед именами типов, которые зависят от параметра шаблона, необходим typename
Yandex
Объявления
16.07.2013, 09:30     Шаблон класса строк - ошибка компиляции
Ответ Создать тему
Опции темы

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