15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
|
1 | |
Итераторы, как параметры лябда-функций в шаблонном классе04.07.2013, 23:38. Показов 1721. Ответов 14
Метки нет Все метки)
(
Доброго здоровья!
Есть такой код (упрощенный вариант для наглядного описания ситуации): Код
template<typename Type> struct A { std::function<Type(typename std::vector<Type>::iterator)> f1 = [&](typename std::vector<Type>::iterator arg) { return *arg ; }; }; int main() { std::vector<float> inp={1}; A<float> obj; auto a = inp.begin(); std::cout<<obj.f1(a); } Код
g++-4.7 -c -g -std=c++11 -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.cpp main.cpp:38:52: ошибка: несоответствия типа/значения в аргументе 1 в списке параметров шаблона для «template<class _Signature> class std::function» main.cpp:38:52: ошибка: ожидался тип, обнаружено «(Type)(std::vector<_RealType>::iterator)» main.cpp: In constructor «constexpr A<float>::A()»: main.cpp:36:8: ошибка: invalid user-defined conversion from «<lambda(std::vector<float, std::allocator<float> >::iterator)>» to «int» [-fpermissive] main.cpp:39:49: замечание: candidate is: <lambda(std::vector<float, std::allocator<float> >::iterator)>::operator double (*)(std::vector<float, std::allocator<float> >::iterator)() const <near match> main.cpp:39:49: замечание: no known conversion for implicit «this» parameter from «double (*)(std::vector<float, std::allocator<float> >::iterator) {aka double (*)(__gnu_cxx::__normal_iterator<float*, std::vector<float, std::allocator<float> > >)}» to «int» main.cpp: В функции «int main()»: main.cpp:53:14: замечание: synthesized method «constexpr A<float>::A()» first required here main.cpp:54:14: ошибка: нет декларации «inp» в этой области видимости main.cpp:54:24: ошибка: unable to deduce «auto» from «<expression error>» main.cpp:55:24: ошибка: «obj.A<float>::f1» нельзя использовать как функцию Заранее спасибо.
0
|
04.07.2013, 23:38 | |
04.07.2013, 23:38 | |
Ответы с готовыми решениями:
14
Параметры в шаблонном классе
Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? |
Неэпический
![]() |
||||||
04.07.2013, 23:43 | 2 | |||||
Вы инициализируете переменную прямо в объявлении класса.
Попробуйте так:
1
|
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
|
||||||
05.07.2013, 00:17 | 4 | |||||
можно еще чутка сократить :
1
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
||||||||||||||||
05.07.2013, 00:58 [ТС] | 5 | |||||||||||||||
Croessmah, ssXXss, спасибо за ответы, Ваши варианты работают, но...
Давайте усложним задачу: BaseClass.hpp:
DerClass.hpp:
Код
In file included from DerClass.hpp:4:0, from main.cpp:10: BaseClass.hpp:11:52: ошибка: несоответствия типа/значения в аргументе 1 в списке параметров шаблона для «template<class _Signature> class std::function» BaseClass.hpp:11:52: ошибка: ожидался тип, обнаружено «(void)(std::vector<_RealType>::iterator)» BaseClass.hpp: In constructor «BaseClass<Type>::BaseClass(unsigned int)»: BaseClass.hpp:18:38: ошибка: «std::vector<_RealType, std::allocator<_Tp1> >::iterator» is not a type BaseClass.hpp: In lambda function: BaseClass.hpp:18:53: ошибка: invalid type argument of unary «*» (have «int») DerClass.hpp: In instantiation of «void DerClass<Type>::action() [with Type = float]»: In file included from main.cpp:10:0: main.cpp:44:16: required from here DerClass.hpp:26:9: ошибка: «((DerClass<float>*)this)->DerClass<float>::<anonymous>.BaseClass<float>::f» нельзя использовать как функцию BaseClass.hpp: In instantiation of «BaseClass<Type>::BaseClass(unsigned int) [with Type = float]»: In file included from DerClass.hpp:4:0, from main.cpp:10: DerClass.hpp:15:91: required from «DerClass<Type>::DerClass(unsigned int) [with Type = float]» main.cpp:43:26: required from here BaseClass.hpp:18:5: ошибка: invalid user-defined conversion from «BaseClass<Type>::BaseClass(unsigned int) [with Type = float]::<lambda(int)>» to «int» [-fpermissive] BaseClass.hpp:18:50: замечание: candidate is: BaseClass<Type>::BaseClass(unsigned int) [with Type = float]::<lambda(int)>::operator void (*)(int)() const <near match> BaseClass.hpp:18:50: замечание: no known conversion for implicit «this» parameter from «void (*)(int)» to «int» Добавлено через 1 минуту В общем-то, никакого контекста здесь нет - хоть [&], хоть [=] - без разницы. Можно и не лямбду даже.
0
|
Неэпический
![]() |
||||||
05.07.2013, 01:02 | 6 | |||||
Добавлено через 1 минуту
1
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
|
05.07.2013, 01:08 [ТС] | 7 |
Croessmah, да, все заработало) Большое спасибо за помощь)
А Вы не могли бы буквально в двух словах объяснить зачем нужны были typename'ы в этих местах? Честно говоря, я еще не до конца разобрался с этими тайпнеймами )
0
|
Неэпический
![]() |
|
05.07.2013, 01:10 | 8 |
чтобы указать, что iterator - это имя типа. Вообще, для типов, которые зависят от параметров шаблона лучше указывать typename, хотя в некоторых моментах компилятор сможет и сам разобраться
![]()
1
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
|
05.07.2013, 01:12 [ТС] | 9 |
0
|
Каратель
![]() |
|||||||||||
05.07.2013, 01:27 | 10 | ||||||||||
IMHO
лямбда на то лябда чтобы быть в контексте...остается долько гадать что двигало разрабами нового синтаксического сахара
и на этом понимании - в каком контексте лямбда можно мозг сломать. это не укладывается в рамки "простого и понятного кода"
0
|
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
|
||||||
05.07.2013, 02:09 | 11 | |||||
но жизнь лямбда малость упростила ) к примеру :
0
|
В астрале
![]() ![]() 8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
05.07.2013, 14:41 | 12 | ||||||||||
Jupiter, Вцелом, так, да. Однако, не забываем, что инициализация в классе эквивалентна инициализации в конструкторе.
Коды по сути эквивалентны.
1
|
89 / 1 / 3
Регистрация: 04.07.2013
Сообщений: 282
|
||||||
05.07.2013, 14:54 | 13 | |||||
в следующий раз используй
0
|
Неэпический
![]() |
|
05.07.2013, 15:09 | 14 |
svk2140, Этой фразой Вы подписали себе смертный приговор, сейчас налетят коршуны, в т.ч. и я
![]() Если Вам это так нравится, то используйте, но не навязывайте свое мнение другим, ибо для многих using namespace std; является бредом, от которого одни проблемы ![]() Да и вообще, судя по тому, что для Вас это лишь "не придется писать std", возникает вопрос - Вы вообще знаете что Вы делаете using'ом?
0
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
|
05.07.2013, 15:13 [ТС] | 15 |
0
|
05.07.2013, 15:13 | |
05.07.2013, 15:13 | |
Помогаю со студенческими работами здесь
15
Ошибки в шаблонном классе String в шаблонном классе Ошибка в шаблонном классе Итератор в шаблонном классе
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
![]() |
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Что означает знак восклицания в TypeScript
hw_wired 14.02.2025
TypeScript - удивительный язык программирования, который предоставляет множество возможностей для работы с типами данных. Особый интерес вызывает оператор утверждения ненулевого значения, который. . .
|
Как свернуть/скрыть секции кода в Visual Studio Code
hw_wired 14.02.2025
Ежедневно мы работам с файлами, содержащими сотни и тысячи строк кода. Навигация по такому объему становится настоящим испытанием, особенно когда нужно быстро найти нужный метод или переменную. . . .
|
Автоматическое создание файла requirements.txt в Python
hw_wired 14.02.2025
Дружелюбная среда для разработки на Python, один из самых широко используемых языков программирования, состоит не только из самого кода, но и целого ряда важных компонентов. И если вы когда-нибудь. . .
|
Передача переменных окружения в контейнер Docker
hw_wired 14.02.2025
При работе с Docker контейнерами возникает необходимость передать различные настройки и конфигурационные параметры - от строк подключения к базам данных до API ключей. И хотя можно жестко прописать. . .
|
Отличия Constructor и ngOnInit в Angular
hw_wired 14.02.2025
Разработка компонентов в Angular - непростая задача, особенно когда дело доходит до правильной инициализации и управления их жизненным циклом. Каждый разработчик рано или поздно сталкивается с. . .
|
Ошибка "Transport security has blocked a cleartext HTTP" в iOS
hw_wired 14.02.2025
В iOS-разработке часто возникают неожиданные препятствия, и одним из самых распространенных является сообщение об ошибке "Transport security has blocked a cleartext HTTP". Эта ошибка появляется,. . .
|
Ошибка "Cleartext HTTP traffic not permitted" в Android
hw_wired 13.02.2025
При разработке Android-приложений можно столнуться с неприятной ошибкой "Cleartext HTTP traffic not permitted", которая может серьезно затруднить отладку и тестирование. Эта проблема особенно. . .
|
Изменение версии по умолчанию в NVM
hw_wired 13.02.2025
Node Version Manager, или коротко NVM - незаменимый инструмент для разработчиков, использующих Node. js. Многие сталкивались с ситуацией, когда разные проекты требуют различных версий Node. js,. . .
|
Переименование коммита в Git (локального и удаленного)
hw_wired 13.02.2025
Git как система контроля версий предоставляет разработчикам множество средств для управления этой историей, и одним из таких важных средств является возможность изменения сообщений коммитов. Но зачем. . .
|
Отличия Promise и Observable в Angular
hw_wired 13.02.2025
В веб-разработки асинхронные операции стали неотъемлимой частью почти каждого приложения. Ведь согласитесь, было бы странно, если бы при каждом запросе к серверу или при обработке больших объемов. . .
|