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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
koma3
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 66
29.08.2012, 16:37     Возникла трудность с шаблонами #1
Не компилится следующий код. Не даёт вернуть итератор вектора. Почему нельзя так делать?

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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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
5282 / 4801 / 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
152 / 136 / 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
5282 / 4801 / 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
5282 / 4801 / 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
549 / 502 / 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
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.08.2012, 17:23     Возникла трудность с шаблонами #15
загляните сюда:
Создание шаблона
вся ветка:
Создание шаблона
Andsteadur
152 / 136 / 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
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 17:32     Возникла трудность с шаблонами #17

Не по теме:

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



Добавлено через 2 минуты
Цитата Сообщение от Andsteadur Посмотреть сообщение
В MSVS 2008 у меня вываливает ошибки:
В MSVS 2010 то же самое.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
29.08.2012, 18:44     Возникла трудность с шаблонами #18
Возьмите за правило: в любом шаблонном описании вида тип<тип>::тип писать typename перед ним. Компилятор себе и так ноги ломает на синтаксисе Си++, помогите ему выжить. А то он vector<int>::iterator путает с именем метода.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++ Задача с шаблонами и наследованием
C++ Работа с шаблонами С++

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

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

Не по теме:

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

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

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