С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
koma3
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 66
#1

Возникла трудность с шаблонами - C++

29.08.2012, 16:37. Просмотров 1191. Ответов 21
Метки нет (Все метки)

Не компилится следующий код. Не даёт вернуть итератор вектора. Почему нельзя так делать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class Type>
class Vector
{
    vector<Type> v;
 
    vector<Type>::iterator begin()
    {
        return v.begin();
    }
};
 
int main()
{
    Vector<string> s;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2012, 16:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возникла трудность с шаблонами (C++):

Трудность с вычилениями. - C++
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; int main(int argc, char *argv) { float n1=10; float n2=n1/3; ...

Трудность с компиляцией классов - C++
Здраствуйте. У меня возникла проблема при компиляции программы из классов с++. Программа заключается в написании системы управления лифтом....

Трудность в создании программы на С++ линейный алгоритм - C++
длина отрезка задана в дюймах(1 дюйм=2,54 см). перевести значения длины в метрическую систему, то есть выразить её в метрах сантиметрах и...

Работа с шаблонами с++ - C++
Добрый вечер. Опять возник вопрос( Нужно создать шаблон списка. Для этого нужно создать структуру, где будут храниться указатели на...

Программа с шаблонами: - C++
Написал простенькую программу с шаблонами, но компилятору она не нравится. Подскажите, как переделать? #include &lt;iostream&gt; using...

Работа с шаблонами С++ - C++
Задача следующая: реализовать пирамидальную сортировку с итерфейсом таким - подаем класс итератор на наши данные и сласс сравнения в класс...

21
-=ЮрА=-
Заблокирован
Автор FAQ
29.08.2012, 16:47 #2
koma3, vector сам по себе шалонный класс, не надо никаких template обвёрток сразу пиши
C++
1
vector<string> vec;
без своего кода
0
koma3
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 66
29.08.2012, 16:52  [ТС] #3
-=ЮрА=-, это я понимаю. На самом деле у меня есть Класс, в котором есть метод, который возвращает(должен возвращать) итератор. А этот пример я придумал чтобы выразить суть проблемы.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 16:54 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
using namespace std;
 
template <class Type> class Vector
{
    vector<Type> v;
 
    typename vector<Type>::iterator begin()
    {
        return v.begin();
    }
};
 
int main()
{
    Vector<string> s;
    
    return 0;
}
1
-=ЮрА=-
Заблокирован
Автор FAQ
29.08.2012, 16:58 #5
Цитата Сообщение от koma3 Посмотреть сообщение
А этот пример я придумал чтобы выразить суть проблемы.
- аааа ясно. Ну смотри без слова public ты как бы всё переменные сделал скрытыми возможно из за этого
Т.е. так компилится и работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <vector>
#include <iostream>
using namespace std;
 
template <class Type>
class Vector
{
public:
    vector<Type> v;
    vector<Type>::iterator begin()
    {
        return v.begin();
    }
};
 
int main()
{
    Vector<string> s;
    s.begin();
    return 0;
}
0
koma3
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 66
29.08.2012, 16:59  [ТС] #6
alsav22, Спасибо! Только вот теперь межете вкратце обьяснить что это было? Никогда раньше такого не юзал.
0
-=ЮрА=-
Заблокирован
Автор FAQ
29.08.2012, 16:59 #7
Цитата Сообщение от koma3 Посмотреть сообщение
А этот пример я придумал чтобы выразить суть проблемы.
- аааа ясно. Ну смотри без слова public ты как бы всё переменные сделал скрытыми возможно из за этого грабли былиТ.е. так компилится и работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <vector>
#include <iostream>
using namespace std;
 
template <class Type>
class Vector
{
public:
    vector<Type> v;
    vector<Type>::iterator begin()
    {
        return v.begin();
    }
};
 
int main()
{
    Vector<string> s;
    s.begin();
    return 0;
}
0
koma3
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 66
29.08.2012, 17:01  [ТС] #8
-=ЮрА=-, Что-то у меня те же самые ошибки
0
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
29.08.2012, 17:04 #9
koma3, указание typename явно говорит компилятору, что это тип.

В выражении:
C++
1
vector<Type>::iterator
Выражение может означать:
iterator - это имя некого типа
iterator - это статическая переменная.

Указание ключевого слова typename разрешает эту неясность

Собственно об этом нам намекает ворнинг, а ошибка возникает из-за того что компилятор считает std::vector<T>::iterator переменная, а переменная в качестве возвращаемого значения в прототипе метода класса/функции - это ошибка
warning C4346: 'std::vector<T>::iterator' : dependent name is not a type
prefix with 'typename' to indicate a type
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 17:06 #10
Цитата Сообщение от koma3 Посмотреть сообщение
Только вот теперь межете вкратце обьяснить что это было?
Сам не знаю, в чём тут дело. Без typename компилятора выдаёт:
C++
1
2
warning C4346: std::vector<Type>::iterator: зависимое имя не является типом
1>          укажите префикс "typename" для задания типа
0
-=ЮрА=-
Заблокирован
Автор FAQ
29.08.2012, 17:08 #11
Цитата Сообщение от koma3 Посмотреть сообщение
-=ЮрА=-, Что-то у меня те же самые ошибки
- я хз что у тебя
Без полного кода твоего класса ответить невозможно!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <vector>
#include <iostream>
using namespace std;
 
template <class Type>
class Vector
{
public:
    vector<Type> v;
    vector<Type>::iterator begin()
    {
        return v.begin();
    }
};
 
int main()
{
    Vector<string> s;
    s.v.push_back("TEST");
    cout<<(*s.begin()).c_str()<<endl;
    return 0;
}
отработку на скрине
0
Миниатюры
Возникла трудность с шаблонами  
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 17:15 #12
mingv строже, у него уже ошибка:
C++
1
2
D:\Code B\asdf\main.cpp|10|error: need 'typename' before 'std::vector<Type>::iterator' because 'std::vector<Type>' is a dependent scope|
||=== Build finished: 1 errors, 0 warnings ===|
0
-=ЮрА=-
29.08.2012, 17:19
  #13

Не по теме:

mingv строже, у него уже ошибка:
- ну тогда рекомендовал бы ТС не пишисать в нём, либо использовать уже готовые шаблонные классы контейнеров, а не сочинять собственные велосипеды...

0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
29.08.2012, 17:22 #14
Цитата Сообщение от alsav22 Посмотреть сообщение
mingv строже, у него уже ошибка:
C++
1
2
D:\Code B\asdf\main.cpp|10|error: need 'typename' before 'std::vector<Type>::iterator' because 'std::vector<Type>' is a dependent scope|
||=== Build finished: 1 errors, 0 warnings ===|
templates нужно в *.h определять. полностью. попробуй и доложи что получится.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.08.2012, 17:23 #15
загляните сюда:
Создание шаблона
вся ветка:
Создание шаблона
1
29.08.2012, 17:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2012, 17:23
Привет! Вот еще темы с ответами:

Работа с шаблонами - C++
Доброго вечера! Сейчас решаю задачку на использование шаблонов, и вот с чем столкнулся: при вводе значений в массив, выдает ошибку (она на...

Ошибка с шаблонами - C++
Возникла проблема. Пример: Создал шаблонный класс с двумя параметрами, один из которых задан по умолчанию. С одной стороны, все работает: ...

Перемножыть матрицы 2*3 и 3*2, в итоге должна быть матрица 3*3, здесь и трудность - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int main(int argc, char *argv) { int i,j,k,l; int...

Задача с шаблонами функций - C++
Необходимо написать программу, которая использует шаблон функции по имени Min для определения наименьшего из двух аргументов, используя...


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

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

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