Parse error in template argument list ардуино

«Конец» не может использоваться в функции шаблона Я хочу использовать простую структуру с переменными-членами с именами start и end в шаблоне функции: Но эта программа не может быть скомпилирована на mingw g ++ 4.8.2 с: Почему нет? Что не так с моим кодом? 4 ответа Это явно ошибка gcc (в частности, 10200, хотя есть […]

Содержание

  1. «Конец» не может использоваться в функции шаблона
  2. 4 ответа
  3. Parse error in template argument list FastLED WS2182B about fastled HOT 2 CLOSED
  4. Comments (2)
  5. Related Issues (20)
  6. Recommend Projects
  7. React
  8. Vue.js
  9. Typescript
  10. TensorFlow
  11. Django
  12. Laravel
  13. Recommend Topics
  14. javascript
  15. server
  16. Machine learning
  17. Visualization
  18. Recommend Org
  19. Facebook
  20. Microsoft
  21. Parse error in template argument list ардуино
  22. АВРчик
  23. АВРчик
  24. АВРчик
  25. bort707
  26. bort707
  27. AlexeyZZZ
  28. Александр Симонов
  29. Вложения
  30. AlexeyZZZ
  31. Александр Симонов
  32. AlexseyShva
  33. [C++11,сказка] Символы для обжатия параметров шаблонов выбраны ошибочно?
  34. не компилируется портянка
  35. Смотрел 2 секунды на код, пишу только то, что увидел, никаких гарантий

«Конец» не может использоваться в функции шаблона

Я хочу использовать простую структуру с переменными-членами с именами start и end в шаблоне функции:

Но эта программа не может быть скомпилирована на mingw g ++ 4.8.2 с:

Почему нет? Что не так с моим кодом?

4 ответа

Это явно ошибка gcc (в частности, 10200, хотя есть несколько дубликатов с множеством разных примеров). [temp.names] утверждает:

Когда имя специализации шаблона члена появляется после. или -> в постфиксном-выражении или после вложенный-указатель-имени в квалифицированный-идентификатор , а объектное выражение постфиксного-выражения является зависимым от типа или спецификатор вложенного-имени в квалифицированном-идентификаторе указывает на зависимый тип, но имя не является членом Для текущего экземпляра (14.6.2.1) имя шаблона элемента должно начинаться с ключевого слова template . В противном случае предполагается, что имя не является шаблоном. [Пример:

v1 и v2 зависят от типа , поэтому следует предполагать, что имя не является шаблоном из-за пропущенного ключевого слова template и <> следует рассматривать как меньше, как в приведенном выше примере.

Не говоря уже о том, что [basic.lookup.classref] утверждает, что:

Идентификатор сначала ищется в классе объекта. выражение. Если идентификатор не найден, он затем ищется в контексте всего postfix-expression и должен назвать шаблон класса.

И end явно должен быть найден в классе объектного выражения — в конце концов, это простая переменная-член. Тот факт, что это сбой для end только из-за столкновения с std::end() , еще больше подтверждает идею ошибки, поскольку эту область видимости никогда не следовало рассматривать с самого начала.

Забавно, но самое простое решение просто: не используйте <>!

Думаю, пока можно проверить состояние в обратном порядке.

Источник

Parse error in template argument list FastLED WS2182B about fastled HOT 2 CLOSED

It’s complaining about DATA_PIN_A / strip 1. Is DATA_PIN_A defined correctly? It may be an invalid pin. Check for invalid pin errors.

WhatsThisBoxFor commented on January 15, 2023

It’s complaining about DATA_PIN_A / strip 1. Is DATA_PIN_A defined correctly? It may be an invalid pin. Check for invalid pin errors.

That was Exactly it! Somehow, I deleted the PIN number after the DATA_PIN_A definition. Thank You!

  • LED setup HOT 3
  • Read data from another controller HOT 2
  • Support for TM1908 HOT 4
  • D1mini and 8 led ring HOT 4
  • Too slow data rate for dotstar HOT 5
  • Hardware SPI on ESP32-S3 HOT 8
  • Seeed nRF52 mbed-enabled board — compiling error
  • I2S Support on ESP32-C3 HOT 9
  • Sudden validpin() compilation error without changes. HOT 4
  • CRGB::Red and CRGB::Green are inverted HOT 5
  • Does not compile for esp32 with latest arduino appimage and arduino updated libs etc
  • Documentation on wave functions could be vastly improved with one tiny addition. HOT 1
  • Going over 10 multiple controller pins crashes ESP32-S2 HOT 3
  • Potential issue with dithering support HOT 4
  • Complie error platforms/arm/stm32/fastpin_arm_stm32.h:58:88: error: incomplete type ‘__gen_struct_GPIOC’ used in nested name specifier HOT 3
  • ISO C++17 does not allow ‘register’ storage class specifier anymore HOT 6
  • ESP8266 + FastLED 3.5.0 + WS2812 = 13us gap after first LED
  • [Question] Do I have to worry about using «delete»? HOT 3
  • Serial input error when using fast LED HOT 5
  • stm32 clockless : minor speed improvement

Recommend Projects

React

A declarative, efficient, and flexible JavaScript library for building user interfaces.

Vue.js

🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

Typescript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

TensorFlow

An Open Source Machine Learning Framework for Everyone

Django

The Web framework for perfectionists with deadlines.

Laravel

A PHP framework for web artisans

Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

javascript

JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

Some thing interesting about web. New door for the world.

server

A server is a program made to process requests and deliver data to clients.

Machine learning

Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

Visualization

Some thing interesting about visualization, use data art

Some thing interesting about game, make everyone happy.

Recommend Org

Facebook

We are working to build community through open source technology. NB: members must have two-factor auth.

Microsoft

Open source projects and samples from Microsoft.

Источник

Parse error in template argument list ардуино

Подключаться буду к выходу операционника. Пока на кнопке тренируюсь. Еще раз спасибо за подсказку Александру.

Все равно тень «не полная»: диоды зажигаются плавно, а гаснут резко.

АВРчик

Добрый вечер,
Извиняюсь заранее если в терминологии напутал.
Подскажите пожалуйста, а какой будет правильный синтаксис объявленияинициализации микролед если я хочу инициализировать в setup, но чтобы была доступна отовсюду.
По типу вот так (указателями это вроде называется):

Но так не работает, ругается что темплейт запрещает объявляться без параметров:

microtest3:48:1: error: invalid use of template-name ‘microLED’ without an argument list
microLED *strip;
^

microtest3.ino:48:1: note: class template argument deduction is only available with -std=c++1z or -std=gnu++1z

microLED.h:151:7: note: ‘template class microLED’ declared here
class microLED <
^

exit status 1
invalid use of template-name ‘microLED’ without an argument list

Ах да, версия библиотеки последняя — 3.1.

АВРчик

АВРчик

Из одного выходит другое. В конечном счёте мне нужно тоже самое — динамически присваивать размер массива.

bort707

значения ORDER_BRG и ORDER_GBR взаимно перепутаны.

Кстати, в предыдущей версии ORDER_BRG тоже было неверно описано.

bort707

никак. В текущей версии библиотеки число светодиодов ленты включено в параметры шаблона, поэтому создать указатель на обьект можно только зная заранее правильное число диодов в ленте.

Надо чуть переписать библиотеку, чтобы темплейт не включал число светодиодов.
Лучше, наверно, как раньше, передавать обьекту типа microLED указатель на внешний массив светодиодов.
Хотя по мне проще пользоваться версией 2. и не переходить на новую. Пусть авторы ее допилят сначала.

AlexeyZZZ

Александр Симонов

Вложения

AlexeyZZZ

Александр Симонов

@AlexeyZZZ, тонкости AVR-ассемблера, в некоторых командах не все регистры можно использовать, а в коде библиотеки не прописаны эти ограничения при распихивании переменных по регистрам. По тексту ошибки можно нагуглить обсуждения и решение.

По-хорошему бы, @AlexGyver самому стоило бы глянуть и исправить, может я чего-нибудь другое сломал этим решением.

AlexseyShva

In file included from D:LEDstairs-master (1)LEDstairs-masterfirmwareLEDstairs_v1.1LEDstairs_v1.1.ino:45:0:

Источник

[C++11,сказка] Символы для обжатия параметров шаблонов выбраны ошибочно?

Сообщество, посмотри, а не ошибочно ли выбраны символы для обжатия шаблонных параметров.

Итак, жили-были две функции:

И на лексемы разбирались они успешно и без конфликтов.

И был у них друг помошник:

Лексер и его на лексемы разбирал.

Но пришли злые шаблоногородители и по нагородили шаблонов.

Нагородили шаблонные структуры типа таких:

и переменные типа таких:

А лексер всё стоял и терпел. Он всё успешно на лексемы разбирал.

Но радилась как-то в коде функция типа такой:

И не выдержал лексер:

Не понял он что хотят от него.

. да как же вам объяснить?
А давайте я заменю » » на «>».

И не понял лексер, что хотят от него.

А потом уродилось в коде ещё и это:

Но лексер терпел.

Терпел, да не выдержал.

Решил он забить на дело гиблое:

И ужёл он к другим стандартописателям.

tags: черновик, сказка, С++11, шаблоны, макросы, лексер

Adler
Да, труп страуса сделал неудачный выбор скобок для параметров шаблона

Закопайте уже труп стюардессы страуса.Adler

> void func2(a =8>=8);
Так верстают только чудаки.

>void func2(a =8>=8); // fail
Прежде чем давать дефолтное значение аргументу, дай ему имя.
Это все-равно что писать: int = 2+2

>F(map ,m); //fail
Возьми ( и ) — расставлять по вкусу.

«понапишу-ка я фигни и буду утверждать, что это проблема компилятора и языка»-тред.

Adler
> void func1(bool=8>=8); //ok

Вон из профессии.

Adler
> void func2(a =8>=8); // fail
а если написать по нормальному
void func2(a var=8>=8); // ok

=A=L=X=
> Adler
> > void func1(bool=8>=8); //ok
> Вон из профессии.

4) Declares an unnamed parameter with a default value

eMan.Lived
> А что не так?

Уважайте коллег. Пишите разборчиво.

Kartonagnick
> Уважайте коллег. Пишите разборчиво.
В свою очередь уважайте тех, для кого программирование не профессиональная деятельность, но хобби.

eMan.Lived
> В свою очередь уважайте тех, для кого программирование не профессиональная
> деятельность, но хобби.

Я уважаю, поэтому стараюсь писать максимально разборчиво. Что бы даже дилетанты смогли понять.

Так ведь у ТС всё тоже разборчиво — код подаётся небольшими порциями, перемежающимися собственными рассуждениями. Если же у кого-то возникла проблема с «распарсиванием» кода, то это скорее всего признак квалификации «распарсивающего», а не автора темы.

Kartonagnick
> Я уважаю, поэтому стараюсь писать максимально разборчиво.
Хочешь сказать, что Adler не старался, или, старался, но недостаточно? 🙂

eMan.Lived
> Так ведь у ТС всё тоже разборчиво — код подаётся небольшими порциями,
> перемежающимися собственными рассуждениями. Если же у кого-то возникла проблема
> с «распарсиванием» кода, то это скорее всего признак квалификации
> «распарсивающего», а не автора темы.

Объясните это своему компилятору и его разработчикам.

eMan.Lived
> Хочешь сказать, что Adler не старался, или, старался, но недостаточно? 🙂

Хочу сказать, что контекстно-зависимые правила языка достаточно сложны.
Поэтому, нет ничего удивительного в том, что какую то редкую конструкцию компилятор не смог распарсить.

Однако факт — компиляторы тестируют на рабоспосбность, отрабатывая все стандартные юзкейсы.

Поэтому, спотыкаются компили только на нестандартных, черезвычайно редких конструкциях языка.

Вывод: подобного рода «нежданчики» сегодня таятся далеко за пределами нормального использования. И проявляются только у извращенцев, которые пишут код через жеппу.

Лично меня мало волнуют трудности компилятора. Меня волнуют трудности людей. Которым это придется читать и поддерживать.

Поэтому, я поддерживаю. За такое:

=A=L=X=
> > void func1(bool=8>=8); //ok
> Вон из профессии.

Источник

не компилируется портянка

Здравствуйте, что-то подвис на компиляции такого. подскажите, как поправить

Смотрел 2 секунды на код, пишу только то, что увидел, никаких гарантий

пробовал… не помогает

Ты откуда в С++ залез? Вылезай, либо срочно за букварь.

Хотя после этого:

Хотя тебе уже ответили. Ну похоже мамкин гений попросту не осилил понять что и где менять. Меняй лучше.

ты понимаешь вообще, что это упрощенный пример? если есть что-то по теме, то продемонстрируй, а просто так не флуди

Тебе уже ответили. Тебе сказали даже как починить. Флудишь тут ты.

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

Ты можешь тупить где-нибудь в другом месте, не на ЛОРе?

Для облегчения жизни в будущем:

  • приводи ошибки компилятора, если ты просто скажешь — «нет, всё равно ошибка» немногие будут гадать, что у тебя там не так
  • упрощённый пример должен быть корректным, т. е. демонстрировать все проблемы(как поправить то, что ты привёл в ОП анон подсказал, если есть что ещё — см. п. 1)

да, typename… точно, спасибо

Анонимус, уходи. Надоел со своим вечным пессимизмом, ступай на свой Ычан и целуй ноги Соуса.

xperious , сейчас попробую покумекать над вашей «лапшой», сходу могу сказать, что const перед типом ставится, ЕМНИП.

да, разобрался, в реальности просто портянка гораздо менее читаемая была, сдуру влепил typename в список аргументов шаблона

Ну вот и славно.

да ошибка вот такая была:

error: parse error in template argument list return func_impl (self, arg1, arg2, arg3, false); ^

смысл, думаю, приводить то…

сходу могу сказать, что const перед типом ставится

Источник

«Конец» не может использоваться в функции шаблона

Я хочу использовать простую структуру с переменными-членами с именами start и end в шаблоне функции:

Но эта программа не может быть скомпилирована на mingw g ++ 4.8.2 с:

Почему нет? Что не так с моим кодом?

4 ответа

Это явно ошибка gcc (в частности, 10200, хотя есть несколько дубликатов с множеством разных примеров). [temp.names] утверждает:

Когда имя специализации шаблона члена появляется после. или -> в постфиксном-выражении или после вложенный-указатель-имени в квалифицированный-идентификатор , а объектное выражение постфиксного-выражения является зависимым от типа или спецификатор вложенного-имени в квалифицированном-идентификаторе указывает на зависимый тип, но имя не является членом Для текущего экземпляра (14.6.2.1) имя шаблона элемента должно начинаться с ключевого слова template . В противном случае предполагается, что имя не является шаблоном. [Пример:

v1 и v2 зависят от типа , поэтому следует предполагать, что имя не является шаблоном из-за пропущенного ключевого слова template и <> следует рассматривать как меньше, как в приведенном выше примере.

Не говоря уже о том, что [basic.lookup.classref] утверждает, что:

Идентификатор сначала ищется в классе объекта. выражение. Если идентификатор не найден, он затем ищется в контексте всего postfix-expression и должен назвать шаблон класса.

И end явно должен быть найден в классе объектного выражения — в конце концов, это простая переменная-член. Тот факт, что это сбой для end только из-за столкновения с std::end() , еще больше подтверждает идею ошибки, поскольку эту область видимости никогда не следовало рассматривать с самого начала.

Забавно, но самое простое решение просто: не используйте <>!

Думаю, пока можно проверить состояние в обратном порядке.

Источник

Parse error in template argument list FastLED WS2182B about FastLED HOT 2 CLOSED

Getting parse error in template, Arduino Uno board, just randomly did this and only does it on this file, I can go download the DemoReel100 and it is set up the same way and it will upload and display fine. any help?

here’s the code causing the error:

FastLED.addLeds (ledsB, NUM_LEDS_STRIP_2);

And here’s the error code:

It’s complaining about DATA_PIN_A / strip 1. Is DATA_PIN_A defined correctly? It may be an invalid pin. Check for invalid pin errors.

WhatsThisBoxFor commented on February 28, 2022

It’s complaining about DATA_PIN_A / strip 1. Is DATA_PIN_A defined correctly? It may be an invalid pin. Check for invalid pin errors.

That was Exactly it! Somehow, I deleted the PIN number after the DATA_PIN_A definition. Thank You!

  • Nano wifi boards support HOT 1
  • Bug with WS2812 and ESP32/8266 (solved with delay between .shows) HOT 2
  • compiling error HOT 1
  • control reaches end of non-void function [-Wreturn-type] pixelset.h
  • Porting of FastLed library on Arduino Nicla Sense Me platform
  • How to compile for ESP32-S3 using ESP-IDF? HOT 4
  • Incompatible w/ Current Adafruit QTPY SAMD Board
  • Inaccurate rgb2hsv and hsv2rgb conversion HOT 1
  • FastLED not working on ItsyBitsy nRF52840 HOT 1
  • Is waiting in esp32 i2s really needed?
  • WS2818 support? HOT 3
  • How to call/ change LED colour by input(text) HOT 4
  • ESP32 Harware SPI is not documneted but is recommended by compiler
  • Feature Request / Clarification: Set maximum power consumption per led «strip» HOT 4
  • Not working with ESP32 C3
  • Atmega664A & Atmega664 «No hardware SPI pins defined.»
  • ESP8266,turn on wifi, need twice “show()» function to work. HOT 3
  • FastLED not working on Unexpected Maker Feather S2 LED is APA102 HOT 1
  • Using HSV with CRGBPalette16 generates poor result
  • FastLED not C++17 compliant HOT 1

Recommend Projects

React

A declarative, efficient, and flexible JavaScript library for building user interfaces.

Vue.js

🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

Typescript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

TensorFlow

An Open Source Machine Learning Framework for Everyone

Django

The Web framework for perfectionists with deadlines.

Laravel

A PHP framework for web artisans

Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

javascript

JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

Some thing interesting about web. New door for the world.

server

A server is a program made to process requests and deliver data to clients.

Machine learning

Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

Visualization

Some thing interesting about visualization, use data art

Some thing interesting about game, make everyone happy.

Recommend Org

Facebook

We are working to build community through open source technology. NB: members must have two-factor auth.

Microsoft

Open source projects and samples from Microsoft.

Источник

can’t compile the code #18

I have arduino 1.6.5 (OSX) and esp8266 lib v2.1.0

while compiling I get this errors:

ESP8266HueEmulator:37: error: invalid use of template-name ‘NeoPixelBus’ without an argument list
ESP8266HueEmulator:38: error: ‘NeoPixelAnimator’ does not name a type
ESP8266HueEmulator.ino: In function ‘void handleAllOthers()’:
ESP8266HueEmulator:174: error: ‘strip’ was not declared in this scope
ESP8266HueEmulator:177: error: ‘AnimUpdateCallback’ was not declared in this scope
ESP8266HueEmulator:177: error: expected ‘;’ before ‘animUpdate’
ESP8266HueEmulator:184: error: ‘animator’ was not declared in this scope
ESP8266HueEmulator:184: error: ‘animUpdate’ was not declared in this scope
ESP8266HueEmulator:188: error: ‘AnimUpdateCallback’ was not declared in this scope
ESP8266HueEmulator:188: error: expected ‘;’ before ‘animUpdate’
ESP8266HueEmulator:195: error: ‘animator’ was not declared in this scope
ESP8266HueEmulator:195: error: ‘animUpdate’ was not declared in this scope
ESP8266HueEmulator.ino: In function ‘void setup()’:
ESP8266HueEmulator:228: error: ‘strip’ was not declared in this scope
ESP8266HueEmulator.ino: In function ‘void loop()’:
ESP8266HueEmulator:297: error: ‘animator’ was not declared in this scope
ESP8266HueEmulator:298: error: ‘strip’ was not declared in this scope
ESP8266HueEmulator.ino: In function ‘void infoLight(RgbColor)’:
ESP8266HueEmulator:309: error: ‘strip’ was not declared in this scope
ESP8266HueEmulator.ino: In function ‘void addLightJson(aJsonObject*, int)’:
ESP8266HueEmulator:403: error: ‘strip’ was not declared in this scope
invalid use of template-name ‘NeoPixelBus’ without an argument list

what do I wrong?

The text was updated successfully, but these errors were encountered:

Which branch of NeoPixelBus are you using? Might be the wrong one.

I use this one:
NeoPixelBus by Makuna by Michael C. Miller (makuna@live.com) Version 2.0.5

Yes but which branch? You probably need the NeoPixelAnimator branch of NeoPixelBus.
(Discussion regarding the branches on Makuna/NeoPixelBus#50 (comment))

don’t really know. Iinstalled it via library manager.
can you tell me what I need?

Just discovered that the NeoPixelAnimator branch of NeoPixelBus seems to be gone. Please ask in https://github.com/Makuna/NeoPixelBus/issues

This code base is based on an old version that never did get supported by the library manager. That branch of my library is now gone and evolved into the one code base that is supported by the library manager. This codebase needs to be updated to the official library manager release version. The readme also makes comments that are no longer true. Esp8266/Arduino is supported in the board manager and should be the primary way to get it. ;-)

@morphygee You should consider upgrading to the latest IDE 1.6.8, in 1.6.5 there were bugs with board and library upgrades that caused them to not update correctly. But this is not your issue at hand right now.

@probonopd were it possible to update your code to the master branch of neopixelbus?
@Makuna I tryed the 1.6.8 too. was the same issue.

@morphygee it is probably possible but I don’t have the time to do so at the moment, sorry. Perhaps @Makuna could provide a copy of the old branches in the meantime.

@Makuna I merged and (I think) corrected which branch to pull (the default one) but still get compile errors, see https://travis-ci.org/probonopd/ESP8266HueEmulator

A bunch of those are from the network.

Missed it, but you need to add an include for NeoPixelAnimator.h.

The warnings in the NeoPixelLibrary should be ignored, the ones I spotted you are not even using that code and they are part of template feature classes which requires the parameters for compatibility between template feature classes.

Thanks for your help @Makuna, unfortunately the build still fails (log). Can you spot what I am doing wrong? Thanks

The warning level is so high on your test build it makes it hard to read. It is warning about arguments and variables not used in template functions; which are used if a different method is provided; all standard template architecture.

this one was obvious though

linear blend for HslColor and HsbColor changed, it is now a template function, si it needs a feature.method class that defines how to blend Hue; so the following is most common to use.

The rest are probably the same thing, fix all the LinearBlend for HslColor and HsbColor.

I can compile the current master fine with the following steps:

  • I used Arduino-1.6.11.hourly201608161225.esp497d19d-x86_64.AppImage which comes with the latest versions of both the Arduino IDE and esp8266/Arduino ready-to-use
  • In the Arduino IDE, Open the Library Manager and search for «NeoPixelBus by Makuna» and install
  • Download https://github.com/interactive-matter/aJson/archive/master.zip and install the library via the Arduino IDE
  • Edit the sketch to contain your WLAN credentials
  • Compile

Hi I get stuck at IP2STR error log below. Also could not locate where to do // Replace avm/pgmspace.h with pgmspace.h // could not find any such file.

Arduino: 1.6.9 (Mac OS X), Board: «Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 512K (64K SPIFFS), ck, Disabled, None»

WARNING: Spurious .github folder in ‘Adafruit NeoPixel’ library
In file included from /Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/user_interface.h:13:0,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/internal/NeoEsp8266DmaMethod.h:49,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/NeoPixelBus.h:57,
from sketch/LightService.cpp:7:
sketch/LightService.cpp: In function ‘int ssdpMsgFormatCallback(SSDPClass*, char*, int, bool, int, char*, char*, char*, char*, uint32_t, uint16_t, char*)’:
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:39: error: invalid operands of types ‘uint32_t* ‘ and ‘int’ to binary ‘operator&’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:99:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:65: error: invalid operands of types ‘uint32_t* ‘ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:99:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:96: error: invalid operands of types ‘uint32_t* ‘ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:99:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
In file included from /Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/user_interface.h:13:0,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/internal/NeoEsp8266DmaMethod.h:49,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/NeoPixelBus.h:57,
from sketch/LightService.cpp:7:
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:128: error: invalid operands of types ‘uint32_t* ‘ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:99:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
In file included from /Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/user_interface.h:13:0,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/internal/NeoEsp8266DmaMethod.h:49,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/NeoPixelBus.h:57,
from sketch/LightService.cpp:7:
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:39: error: invalid operands of types ‘uint32_t* ‘ and ‘int’ to binary ‘operator&’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:108:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:65: error: invalid operands of types ‘uint32_t* ‘ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:108:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:96: error: invalid operands of types ‘uint32_t* ‘ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:108:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
In file included from /Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/user_interface.h:13:0,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/internal/NeoEsp8266DmaMethod.h:49,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/NeoPixelBus.h:57,
from sketch/LightService.cpp:7:
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:128: error: invalid operands of types ‘uint32_t* ‘ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:108:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
exit status 1
Error compiling for board Generic ESP8266 Module.

This report would have more information with
«Show verbose output during compilation»
option enabled in File -> Preferences.

Which exact combination of Arduino IDE version and library versions are you using? See .travis.yml for «known good» versions.

I have Arduino 1.6.9
ESP8266 2.2.0
And the Neobixel bus by Makuna 2.1.4 as mentioned.

I am in the process of updating Arduino to 1.6.13
ESP8266 to latest version. Will test and update in some time. Seems like the IP2STR error is due to ESP

Compile and upload done with the above mentioned version, however not able to connect to any wifi access point and no output on serial monitor. Even the test string in serial print doesn’t come up.

I have been able to compile and deploy it for test successfully. Was able to find the bridge via the app and also able to control 6 LEDs of the strip individually. Power was the issue. I had all powered up from USB port, later moved Strip and ESP to external 2A power adapter. Since then it all is fine. I also recall that I faced similar issue with ESP before. It seems USB port can not provide enough power to run the wifi thing. External power supply fixed it.

Thanks for the code. Nice work. Will see how soon I can get to controlling the entire strip.

Which app and app version did you use? Looks to me like they have changed something in the app and I seem to be unable to connect.

Philips hue gen 1 v 1.12.1.0 also the Hue disco app. I have Gen 1 Hue. I only get to do these things on Sundays hence late reply.

© 2022 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Я хочу использовать простую структуру с переменными-членами с именами start и end в шаблоне функции:

#include <iostream>
using namespace std;

struct st {
    int start;
    int end;
};

template<typename T>
void compare(const T& v1, const T& v2){
    if(v1.end < v2.end)
        cout << "v1 < v2" << endl;
}

int main() {
    st a = {1, 2};
    st b = {2, 3};
    compare(a, b);
    return 0;
}

Но эта программа не может быть скомпилирована на mingw g ++ 4.8.2 с:

main.cpp: In function 'void compare(const T&, const T&)':
main.cpp:11:11: error: parse error in template argument list
     if(v1.end < v2.end)
           ^
main.cpp: In instantiation of 'void compare(const T&, const T&) [with T = st]':
main.cpp:18:17:   required from here
main.cpp:11:5: error: 'end' is not a member template function
     if(v1.end < v2.end)
     ^

Почему нет? Что не так с моим кодом?

4 ответа

Лучший ответ

Это явно ошибка gcc (в частности, 10200, хотя есть несколько дубликатов с множеством разных примеров). [temp.names] утверждает:

Когда имя специализации шаблона члена появляется после. или -> в постфиксном-выражении или после вложенный-указатель-имени в квалифицированный-идентификатор , а объектное выражение постфиксного-выражения является зависимым от типа или спецификатор вложенного-имени в квалифицированном-идентификаторе указывает на зависимый тип, но имя не является членом Для текущего экземпляра (14.6.2.1) имя шаблона элемента должно начинаться с ключевого слова template. В противном случае предполагается, что имя не является шаблоном. [Пример:

struct X {
    template<std::size_t> X* alloc();
    template<std::size_t> static X* adjust();
};

template<class T> void f(T* p) {
    T* p1 = p->alloc<200>();          // ill-formed: < means less than
    T* p2 = p->template alloc<200>(); // OK: < starts template argument list
    T::adjust<100>();                 // ill-formed: < means less than
    T::template adjust<100>();        // OK: < starts template argument list
}

—конечный пример]

v1 и v2 зависят от типа , поэтому следует предполагать, что имя не является шаблоном из-за пропущенного ключевого слова template и {{X3 }} следует рассматривать как меньше, как в приведенном выше примере.

Не говоря уже о том, что [basic.lookup.classref] утверждает, что:

Идентификатор сначала ищется в классе объекта. выражение. Если идентификатор не найден, он затем ищется в контексте всего postfix-expression и должен назвать шаблон класса.

И end явно должен быть найден в классе объектного выражения — в конце концов, это простая переменная-член. Тот факт, что это сбой для end только из-за столкновения с std::end(), еще больше подтверждает идею ошибки, поскольку эту область видимости никогда не следовало рассматривать с самого начала.

Забавно, но самое простое решение просто: не используйте {{X0} }!


10

Community
23 Май 2017 в 12:08

Думаю, пока можно проверить состояние в обратном порядке.

#include <iostream>
using namespace std;

struct st {
    int start;
    int end;
};

template<typename T>
void compare(const T& v1, const T& v2){
    if(v2.end > v1.end)    //changed the comparison order
        cout << "v1 < v2" << endl;
}

int main() {
    st a = {1, 2};
    st b = {2, 3};
    compare(a, b);
    return 0;
}


0

spnsp
15 Янв 2018 в 10:01

Похоже, что g ++ 4.8.4 также имеет проблемы, когда переменная-член равна begin или end.

С помощью

struct st{
    int begin;
    int end;
};

template <typename T>
void compare(const T& v1, const T& v2){
    if(v1.begin < v2.begin)
    {
        cout << "v1.begin < v2.begin" << endl;
    }
    if(v1.end < v2.end)
    {
        cout << "v1.end < v2.end" << endl;
    }
}

Выдает следующее сообщение об ошибке.

socc.cc: In function ‘void compare(const T&, const T&)’:
socc.cc:12:11: error: parse error in template argument list
     if(v1.begin < v2.begin)
           ^
socc.cc:16:11: error: parse error in template argument list
     if(v1.end < v2.end)
           ^
socc.cc: In instantiation of ‘void compare(const T&, const T&) [with T = st]’:
socc.cc:25:17:   required from here
socc.cc:12:5: error: ‘begin’ is not a member template function
     if(v1.begin < v2.begin)
     ^
socc.cc:16:5: error: ‘end’ is not a member template function
     if(v1.end < v2.end)

Возможно, кто-то более знакомый с разработкой g ++, чем я, может предоставить более подробную информацию.

Один из способов решения проблемы — избегать использования begin и end в качестве переменных-членов.

struct st{
    int _begin;
    int _end;
};

Или

struct st{
    int _start;
    int _end;
};


0

R Sahu
29 Июл 2015 в 04:49

На самом деле это <, которое сбивает компилятор с толку, поскольку он не знает, начало ли это выражения шаблона или компаратора.

Поскольку @R Sahu запросил официальные источники, вот объяснение:

Здесь важен абзац [basic.lookup.classref] p1:

«В выражении доступа к члену класса (5.2.5), если токен . или -> сразу за которым следует идентификатор, за которым следует <, идентификатор необходимо найти, чтобы определить, является ли <началом список аргументов шаблона (14.2) или оператор «меньше». Идентификатор сначала ищется в классе объектного выражения. Если идентификатор не найден, затем он ищется в контексте все постфиксное выражение и должно называть шаблон класса. «

Поскольку v является зависимым, предположительно идентификатор не найден, поэтому мы рассмотрим, что произойдет, если мы посмотрим в контексте всего постфиксного выражения. Поскольку мы находим шаблон функции, мы не должны заключать, что у нас есть начало идентификатора шаблона.

Источник: Запутанное имя атрибута C ++ для шаблона члена

И вот соответствующая ошибка gcc: https: // gcc. gnu.org/bugzilla/show_bug.cgi?id=10200

* Паоло Карлини, 23 июня 2015, 15:03:03 UTC *

Ошибка 65878 была помечена как дубликат этой ошибки.

* Колин Маккензи, 23.06.2015, 22:19:29 UTC *

Был этот сегодня. Странно, что он отлично компилируется в 4.4.6, но не в 4.8.2.

error: parse error in template argument list 
Ex: assert(block.begin <  block.end);

works when I parenthesize the block.begin 
Ex. assert( (block.begin) < block.end);

* Паоло Карлини, 23.06.2015, 22:21:28 UTC *

Это должно быть исправлено как можно скорее, но в данный момент я активно над этим не работаю.


8

Community
23 Май 2017 в 11:51

Hi I get stuck at IP2STR error log below. Also could not locate where to do // Replace avm/pgmspace.h with pgmspace.h // could not find any such file.

Arduino: 1.6.9 (Mac OS X), Board: «Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 512K (64K SPIFFS), ck, Disabled, None»

WARNING: Spurious .github folder in ‘Adafruit NeoPixel’ library
In file included from /Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/user_interface.h:13:0,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/internal/NeoEsp8266DmaMethod.h:49,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/NeoPixelBus.h:57,
from sketch/LightService.cpp:7:
sketch/LightService.cpp: In function ‘int ssdpMsgFormatCallback(SSDPClass*, char*, int, bool, int, char*, char*, char*, char*, uint32_t, uint16_t, char*)’:
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:39: error: invalid operands of types ‘uint32_t* {aka unsigned int*}’ and ‘int’ to binary ‘operator&’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:99:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:65: error: invalid operands of types ‘uint32_t* {aka unsigned int*}’ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:99:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:96: error: invalid operands of types ‘uint32_t* {aka unsigned int*}’ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:99:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
In file included from /Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/user_interface.h:13:0,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/internal/NeoEsp8266DmaMethod.h:49,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/NeoPixelBus.h:57,
from sketch/LightService.cpp:7:
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:128: error: invalid operands of types ‘uint32_t* {aka unsigned int*}’ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:99:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
In file included from /Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/user_interface.h:13:0,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/internal/NeoEsp8266DmaMethod.h:49,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/NeoPixelBus.h:57,
from sketch/LightService.cpp:7:
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:39: error: invalid operands of types ‘uint32_t* {aka unsigned int*}’ and ‘int’ to binary ‘operator&’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:108:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:65: error: invalid operands of types ‘uint32_t* {aka unsigned int*}’ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:108:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:96: error: invalid operands of types ‘uint32_t* {aka unsigned int*}’ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:108:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
In file included from /Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/user_interface.h:13:0,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/internal/NeoEsp8266DmaMethod.h:49,
from /Users/utkarsh/Documents/Arduino/libraries/NeoPixelBus_by_Makuna/src/NeoPixelBus.h:57,
from sketch/LightService.cpp:7:
/Users/utkarsh/Library/Arduino15/packages/esp8266/hardware/esp8266/2.2.0/tools/sdk/include/ip_addr.h:56:128: error: invalid operands of types ‘uint32_t* {aka unsigned int*}’ and ‘int’ to binary ‘operator>>’
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 24) & 0xFF)
^
sketch/LightService.cpp:108:7: note: in expansion of macro ‘IP2STR’
IP2STR(&ip), port, schemaURL,
^
exit status 1
Error compiling for board Generic ESP8266 Module.

This report would have more information with
«Show verbose output during compilation»
option enabled in File -> Preferences.

Здравствуйте. Первый раз сталкиваюсь с ардуино. Остановился на такой же ошибке:
‘LEDdata’ does not name a type; did you mean ‘mData’?
Всё, что выше писали делаю, ошибка не уходит.
Точнее, микролед версия 3.4, а версии 2.3 нет на гитхабе

/*
Скетч к проекту «Наливатор by AlexGyver»
— Страница проекта (схемы, описания): https://alexgyver.ru/GyverDrink/
— Исходники на GitHub: https://github.com/AlexGyver/GyverDrink/
Проблемы с загрузкой? Читай гайд для новичков: https://alexgyver.ru/arduino-first/
Нравится, как написан код? Поддержи автора! https://alexgyver.ru/support_alex/
Автор: AlexGyver, AlexGyver Technologies, 2019
https://www.youtube.com/c/alexgyvershow
https://github.com/AlexGyver
https://AlexGyver.ru/
[email protected]
*/

/*
Версия 1.1:
— Поправлена работа системы при выборе некорректного объёма
— Исправлены ошибки при наливании больших объёмов
— Исправлен баг с остановкой наливания при убирании другой рюмки

Версия 1.2:
— Исправлено ограничение выбора объёма
— Исправлены ошибки (обновите библиотеки из архива! servoSmooth v1.8, microLED v2.3)
— Добавлено хранение в памяти выбранного объёма

Версия 1.3:
— Исправлен баг со снятием рюмки в авто режиме (жука поймал Юрий Соколов)

Версия 1.4:
— Добавлена настройка уровня концевиков (для ИК датчиков)
— Исправлена ошибка с наливанием больших объёмов

Версия 1.5:
— Добавлена инверсия сервопривода (ОБНОВИТЕ БИБЛИОТЕКУ ИЗ АРХИВА)
*/

// ======== НАСТРОЙКИ ========
#define NUM_SHOTS 4 // количество рюмок (оно же кол-во светодиодов и кнопок!)
#define TIMEOUT_OFF 5 // таймаут на выключение (перестаёт дёргать привод), минут
#define SWITCH_LEVEL 0 // кнопки 1 — высокий сигнал при замыкании, 0 — низкий
#define INVERSE_SERVO 0 // инвертировать направление вращения серво

// положение серво над центрами рюмок
const byte shotPos[] = {25, 60, 95, 145, 60, 60};

// время заполнения 50 мл
const long time50ml = 5500;

#define KEEP_POWER 1 // 1 — система поддержания питания ПБ, чтобы он не спал

// отладка
#define DEBUG_UART 1

// =========== ПИНЫ ===========
#define PUMP_POWER 3
#define SERVO_POWER 4
#define SERVO_PIN 5
#define LED_PIN 6
#define BTN_PIN 7
#define ENC_SW 8
#define ENC_DT 9
#define ENC_CLK 10
#define DISP_DIO 11
#define DISP_CLK 12
const byte SW_pins[] = {A0, A1, A2, A3, A4, A5};

// =========== ЛИБЫ ===========
#include <GyverTM1637.h>
#include <ServoSmooth.h>
#include <microLED.h>
#include <EEPROM.h>
#include «encUniversalMinim.h»
#include «buttonMinim.h»
#include «timer2Minim.h»

// =========== ДАТА ===========
#define COLOR_DEBTH 2 // цветовая глубина: 1, 2, 3 (в байтах)
LEDdata leds[NUM_SHOTS]; // буфер ленты типа LEDdata (размер зависит от COLOR_DEBTH)
microLED strip(leds, NUM_SHOTS, LED_PIN); // объект лента

GyverTM1637 disp(DISP_CLK, DISP_DIO);

// пин clk, пин dt, пин sw, направление (0/1), тип (0/1)
encMinim enc(ENC_CLK, ENC_DT, ENC_SW, 1, 1);

ServoSmooth servo;

buttonMinim btn(BTN_PIN);
buttonMinim encBtn(ENC_SW);
timerMinim LEDtimer(100);
timerMinim FLOWdebounce(20);
timerMinim FLOWtimer(2000);
timerMinim WAITtimer(400);
timerMinim TIMEOUTtimer(15000); // таймаут дёргания приводом
timerMinim POWEROFFtimer(TIMEOUT_OFF * 60000L);

bool LEDchanged = false;
bool pumping = false;
int8_t curPumping = -1;

enum {NO_GLASS, EMPTY, IN_PROCESS, READY} shotStates[NUM_SHOTS];
enum {SEARCH, MOVING, WAIT, PUMPING} systemState;
bool workMode = false; // 0 manual, 1 auto
int thisVolume = 50;
bool systemON = false;
bool timeoutState = false;
bool volumeChanged = false;
bool parking = false;

// =========== МАКРО ===========
#define servoON() digitalWrite(SERVO_POWER, 1)
#define servoOFF() digitalWrite(SERVO_POWER, 0)
#define pumpON() digitalWrite(PUMP_POWER, 1)
#define pumpOFF() digitalWrite(PUMP_POWER, 0)

#if (DEBUG_UART == 1)
#define DEBUG(x) Serial.println(x)
#else
#define DEBUG(x)
#endif

I want to use a simple struct with member variables named start and end in a function template:

#include <iostream>
using namespace std;

struct st {
    int start;
    int end;
};

template<typename T>
void compare(const T& v1, const T& v2){
    if(v1.end < v2.end)
        cout << "v1 < v2" << endl;
}

int main() {
    st a = {1, 2};
    st b = {2, 3};
    compare(a, b);
    return 0;
}

But this program fails to compile on mingw g++ 4.8.2 with:

main.cpp: In function 'void compare(const T&, const T&)':
main.cpp:11:11: error: parse error in template argument list
     if(v1.end < v2.end)
           ^
main.cpp: In instantiation of 'void compare(const T&, const T&) [with T = st]':
main.cpp:18:17:   required from here
main.cpp:11:5: error: 'end' is not a member template function
     if(v1.end < v2.end)
     ^

Why not? What’s wrong with my code?

Barry's user avatar

Barry

278k29 gold badges585 silver badges950 bronze badges

asked Jul 29, 2015 at 3:51

xiao's user avatar

2

This is clearly a gcc bug (specifically 10200 although there are several dupes with lots of different examples). [temp.names] states:

When the name of a member template specialization appears after . or -> in a postfix-expression or after a
nested-name-specifier in a qualified-id, and the object expression of the postfix-expression is type-dependent
or the nested-name-specifier in the qualified-id refers to a dependent type, but the name is not a member of
the current instantiation (14.6.2.1), the member template name must be prefixed by the keyword template.
Otherwise the name is assumed to name a non-template. [ Example:

struct X {
    template<std::size_t> X* alloc();
    template<std::size_t> static X* adjust();
};

template<class T> void f(T* p) {
    T* p1 = p->alloc<200>();          // ill-formed: < means less than
    T* p2 = p->template alloc<200>(); // OK: < starts template argument list
    T::adjust<100>();                 // ill-formed: < means less than
    T::template adjust<100>();        // OK: < starts template argument list
}

—end example ]

v1 and v2 are type-dependent, so the name should be assumed to name a non-template due to the omitted template keyword and the < should be treated as less than, exactly as in the example above.

Not to mention that [basic.lookup.classref] states that:

The identifier is first looked up in the class of the object
expression. If the identifier is not found, it is then looked up in the context of the entire postfix-expression and shall name a class template.

And end should clearly be found in the class of the object expression — it’s a simple member variable, after all. The fact that it’s a failure for end only because of the collision with std::end() further supports the idea of bug since that scope should never have been considered to begin with.

Amusingly, the simplest solution is simply: don’t use using namespace std;!

Community's user avatar

answered Jul 31, 2015 at 22:38

Barry's user avatar

BarryBarry

278k29 gold badges585 silver badges950 bronze badges

Actually it’s the < which confuse the compiler, since it does not know whether it’s the start of a template expression, or the comparator.

Since @R Sahu asked for an official sources, here is the explanation :

The paragraph that matters here is [basic.lookup.classref]p1:

«In a class member access expression (5.2.5), if the . or -> token is
immediately followed by an identifier followed by a <, the identifier
must be looked up to determine whether the < is the beginning of a
template argument list (14.2) or a less-than operator. The identifier
is first looked up in the class of the object expression. If the
identifier is not found, it is then looked up in the context of the
entire postfix-expression and shall name a class template.»

Since v is dependent, presumably the identifier is not found so we
consider what happens if we look in the context of the entire
postfix-expression. Since we find a function template, we should not
conclude that we have the start of a template-id.

Source : C++ confusing attribute name for member template

And here is the corresponding gcc bug : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=10200

* Paolo Carlini 2015-06-23 15:03:03 UTC *

Bug 65878 has been marked as a duplicate of this bug.

* Colin MacKenzie 2015-06-23 22:19:29 UTC *

Had this one today. Strange that it compiles fine in 4.4.6 but not in
4.8.2.

error: parse error in template argument list 
Ex: assert(block.begin <  block.end);

works when I parenthesize the block.begin 
Ex. assert( (block.begin) < block.end);

* Paolo Carlini 2015-06-23 22:21:28 UTC *

This should be fixed ASAP, but I’m not actively working on it at the
moment.

Community's user avatar

answered Jul 31, 2015 at 18:40

lucasg's user avatar

lucasglucasg

10.6k4 gold badges34 silver badges56 bronze badges

It appears that g++ 4.8.4 also has problems when the member variable is begin or end.

Using

struct st{
    int begin;
    int end;
};

template <typename T>
void compare(const T& v1, const T& v2){
    if(v1.begin < v2.begin)
    {
        cout << "v1.begin < v2.begin" << endl;
    }
    if(v1.end < v2.end)
    {
        cout << "v1.end < v2.end" << endl;
    }
}

produces the following error message for me.

socc.cc: In function ‘void compare(const T&, const T&)’:
socc.cc:12:11: error: parse error in template argument list
     if(v1.begin < v2.begin)
           ^
socc.cc:16:11: error: parse error in template argument list
     if(v1.end < v2.end)
           ^
socc.cc: In instantiation of ‘void compare(const T&, const T&) [with T = st]’:
socc.cc:25:17:   required from here
socc.cc:12:5: error: ‘begin’ is not a member template function
     if(v1.begin < v2.begin)
     ^
socc.cc:16:5: error: ‘end’ is not a member template function
     if(v1.end < v2.end)

Perhaps someone more familiar with g++ development than me can provide more details.

One work around is to use avoid using begin and end as member variables.

struct st{
    int _begin;
    int _end;
};

or

struct st{
    int _start;
    int _end;
};

answered Jul 29, 2015 at 4:49

R Sahu's user avatar

R SahuR Sahu

203k14 gold badges151 silver badges265 bronze badges

0

I think, for the time being you can check the condition in reverse order.

#include <iostream>
using namespace std;

struct st {
    int start;
    int end;
};

template<typename T>
void compare(const T& v1, const T& v2){
    if(v2.end > v1.end)    //changed the comparison order
        cout << "v1 < v2" << endl;
}

int main() {
    st a = {1, 2};
    st b = {2, 3};
    compare(a, b);
    return 0;
}

answered Jan 15, 2018 at 10:01

spnsp's user avatar

spnspspnsp

1631 silver badge7 bronze badges

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Parse error expected 0x42 fmt if vorb missing
  • Parse error bundle
  • Parse error before token
  • Parse error before int
  • Parse error at line 1 column 1 unexpected end of file как исправить connect manager

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии