Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
koma3
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 66
1

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

29.08.2012, 16:37. Просмотров 1283. Ответов 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
Ответы с готовыми решениями:

Трудность с вычилениями.
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; int main(int argc,...

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

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

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

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

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
5442 / 4837 / 831
Регистрация: 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 / 34
Регистрация: 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
5442 / 4837 / 831
Регистрация: 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
5442 / 4837 / 831
Регистрация: 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 / 25
Регистрация: 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
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
29.08.2012, 17:23 15
загляните сюда:
http://www.cyberforum.ru/post3070787.html
вся ветка:
Создание шаблона
1
Andsteadur
153 / 137 / 34
Регистрация: 23.05.2009
Сообщений: 275
29.08.2012, 17:29 16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

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

Не по теме:

В MSVS 2008 у меня вываливает ошибки:

1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>d:\test\main.cpp(10) : warning C4346: 'std::vector<Type>::iterator' : dependent name is not a type
1> prefix with 'typename' to indicate a type
1> d:\test\main.cpp(14) : see reference to class template instantiation 'Vector<Type>' being compiled
1>d:\test\main.cpp(10) : error C2146: syntax error : missing ';' before identifier 'begin'
1>d:\test\main.cpp(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\test\main.cpp(13) : warning C4183: 'begin': missing return type; assumed to be a member function returning 'int'

0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 17:32 17

Не по теме:

Цитата Сообщение от novi4ok Посмотреть сообщение
попробуй и доложи что получится
А самим?



Добавлено через 2 минуты
Цитата Сообщение от Andsteadur Посмотреть сообщение
В MSVS 2008 у меня вываливает ошибки:
В MSVS 2010 то же самое.
0
OhMyGodSoLong
~ Эврика! ~
1246 / 995 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
29.08.2012, 18:44 18
Возьмите за правило: в любом шаблонном описании вида тип<тип>::тип писать typename перед ним. Компилятор себе и так ноги ломает на синтаксисе Си++, помогите ему выжить. А то он vector<int>::iterator путает с именем метода.
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.08.2012, 20:06 19
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

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

Пожалуйста, у меня к тебе просьба. Всего одна, не надо сбивать с толку людей, задающих вопрос.
Либо поставь нормальный компилятор, соответствующий стандарту С++98/03 (или С++11) и проверяй код в нем, а если не компилируется - разберись перед тем как отвечать.
Либо смотри в стандарт/книжку, которая описывает реалии стандартов С++.
3
-=ЮрА=-
29.08.2012, 20:20     Возникла трудность с шаблонами
  #20

Не по теме:

ForEveR, может мне кроме компилятора пойти убицца ап стену?Не дождешся!И у меня к тебе просьба-хочешь что то сказать пиши в ЛС, а не загаживай форум;)

0
29.08.2012, 20:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2012, 20:20
Привет! Вот еще темы с ответами:

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

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

Программа с шаблонами:
Написал простенькую программу с шаблонами, но компилятору она не нравится....


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

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

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