neu-rah / ArduinoMenu

Arduino generic menu/interactivity system
GNU Lesser General Public License v2.1
929 stars 189 forks source link

"dynamic initialization" linking error when combining Menu::style and using rotaryEventIn.h #412

Open keldonin opened 1 year ago

keldonin commented 1 year ago

A linkage error occurs when using rotaryEnventIn.h in combination with combined Menu::style:

In this example, the combination

#include <menuIO/rotaryEventIn.h>

...

MENU(saveConfigSubMenu, "Save config", Menu::doNothing, Menu::noEvent, Menu::noStyle | Menu::showTitle,
  OP("OK", saveConfig, enterEvent),
  EXIT("<Cancel")
);

This is likely caused by this lines (amongst other) inside rotaryEventIn.h:

template<class T> inline T operator| (T a, T b) { return (T)((int)a | (int)b); }

As generic programming in this case tend to apply to all enums or classes using an overloaded operator. One can also question if an enumeration is the right object for a bit set?

Anyways, compiler and linker seem happy when generic overloaded operations are declared as constexpr.

PR to follow.