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

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

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

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

29.08.2012, 16:37. Просмотров 1121. Ответов 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;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2012, 16:37     Возникла трудность с шаблонами
Посмотрите здесь:

Трудность с вычилениями. - 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 см). перевести значения длины в метрическую систему, то есть выразить её в метрах сантиметрах и...

Перемножыть матрицы 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++
Добрый вечер. Опять возник вопрос( Нужно создать шаблон списка. Для этого нужно создать структуру, где будут храниться указатели на...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
29.08.2012, 16:47     Возникла трудность с шаблонами #2
koma3, vector сам по себе шалонный класс, не надо никаких template обвёрток сразу пиши
C++
1
vector<string> vec;
без своего кода
koma3
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 66
29.08.2012, 16:52  [ТС]     Возникла трудность с шаблонами #3
-=ЮрА=-, это я понимаю. На самом деле у меня есть Класс, в котором есть метод, который возвращает(должен возвращать) итератор. А этот пример я придумал чтобы выразить суть проблемы.
alsav22
5416 / 4812 / 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;
}
-=ЮрА=-
Заблокирован
Автор 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;
}
koma3
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 66
29.08.2012, 16:59  [ТС]     Возникла трудность с шаблонами #6
alsav22, Спасибо! Только вот теперь межете вкратце обьяснить что это было? Никогда раньше такого не юзал.
-=ЮрА=-
Заблокирован
Автор 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;
}
koma3
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 66
29.08.2012, 17:01  [ТС]     Возникла трудность с шаблонами #8
-=ЮрА=-, Что-то у меня те же самые ошибки
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
alsav22
5416 / 4812 / 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" для задания типа
-=ЮрА=-
Заблокирован
Автор 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;
}
отработку на скрине
Миниатюры
Возникла трудность с шаблонами  
alsav22
5416 / 4812 / 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 ===|
-=ЮрА=-
29.08.2012, 17:19
  #13

Не по теме:

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

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 определять. полностью. попробуй и доложи что получится.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.08.2012, 17:23     Возникла трудность с шаблонами #15
загляните сюда:
Создание шаблона
вся ветка:
Создание шаблона
Andsteadur
153 / 137 / 3
Регистрация: 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'

alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 17:32     Возникла трудность с шаблонами #17

Не по теме:

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



Добавлено через 2 минуты
Цитата Сообщение от Andsteadur Посмотреть сообщение
В MSVS 2008 у меня вываливает ошибки:
В MSVS 2010 то же самое.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
29.08.2012, 18:44     Возникла трудность с шаблонами #18
Возьмите за правило: в любом шаблонном описании вида тип<тип>::тип писать typename перед ним. Компилятор себе и так ноги ломает на синтаксисе Си++, помогите ему выжить. А то он vector<int>::iterator путает с именем метода.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
29.08.2012, 20:06     Возникла трудность с шаблонами #19
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

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

Пожалуйста, у меня к тебе просьба. Всего одна, не надо сбивать с толку людей, задающих вопрос.
Либо поставь нормальный компилятор, соответствующий стандарту С++98/03 (или С++11) и проверяй код в нем, а если не компилируется - разберись перед тем как отвечать.
Либо смотри в стандарт/книжку, которая описывает реалии стандартов С++.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2012, 20:20     Возникла трудность с шаблонами
Еще ссылки по теме:

Как работать с шаблонами - C++
Простенькая програмка, но не компилируеться. Не могу я понять как работать с шаблонами, сколько уже перечитал, все-равно не въеду что не...

Почему не компилируется с шаблонами? - C++
Точнее, компилируется, но не линкуется. Ошибка &quot;undefined reference&quot; в 9-й строке main.cpp. Никак не пойму, как же надо было написать? ...

Задача с шаблонами и наследованием - C++
Ребята, есть такая проблема.. Предположим, что у нас есть класс Image (не шаблонный). И есть класс ImageExt&lt;T1,T2&gt; (шаблонный),...

Реализация стека с шаблонами - C++
Вообщем, реализую стек известная проблема, не могу понять почему не компилирует, хотя 20 раз все проверил #include &lt;iostream&gt; ...

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


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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
29.08.2012, 20:20     Возникла трудность с шаблонами
  #20

Не по теме:

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

Yandex
Объявления
29.08.2012, 20:20     Возникла трудность с шаблонами
Закрытая тема Создать тему
Опции темы

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