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

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

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

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

16.07.2013, 01:07. Просмотров 357. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 01:07     Шаблон класса строк - ошибка компиляции
Посмотрите здесь:

Ошибка в программе, где создается шаблон класса "стек" C++
Шаблон класса. Ошибка `undefined reference` C++
Присвоение указателю члену класса нового адреса, ошибка компиляции C++
Шаблон класса. Ошибка `missing type specifier` C++
C++ Ошибка при компиляции класса
C++ Ошибка wreorder при компиляции класса
Шаблон класса,ошибка TEMPLATE C++
C++ Шаблон класса
C++ шаблон класса
Пытаюсь создать описание класса одномерных массивов строк. В чем моя ошибка? C++
Ошибка компиляции абстрактного класса C++
Ошибка компиляции при реализации класса-шаблона C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12528 / 7090 / 797
Регистрация: 27.09.2012
Сообщений: 17,500
Записей в блоге: 2
Завершенные тесты: 1
16.07.2013, 09:30     Шаблон класса строк - ошибка компиляции #4
Перед именами типов, которые зависят от параметра шаблона, необходим typename
Yandex
Объявления
16.07.2013, 09:30     Шаблон класса строк - ошибка компиляции
Ответ Создать тему
Опции темы

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