boost::tuple mit Funktionszeiger & g++ (Linux) -- will nicht compilieren
-
Hallo,
folgender Code:template < class param> bool CCuboidTreeNode_callFunctionForAppendedCuboid (CCuboidTreeNode* in_c, boost::tuples::tuple<bool (*)(CCuboid*, param), param> in_t) { if (in_c->getIsLeaf()) { assert(in_c->getCuboid()); return (*in_t.get<0>())(in_c->getCuboid(), in_t.get<1>()); // Zeile 357 } return true; }Ich will ihn mit g++ auch unter Linux compilieren (unter Windows mit Visual Studio 8 compiliert er einwandfrei). g++ meldet folgendes Problem:
src/CubicObjects.h: In function »bool CCuboidTreeNode_callFunctionForAppendedCuboid(CCuboidTreeNode*, boost::tuples::tuple<bool ()(CCuboid, param), param, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>)«:
src/CubicObjects.h:357: Fehler: expected primary-expression before »)« token
src/CubicObjects.h:357: Fehler: expected primary-expression before »)« tokenWorin könnte der Fehler liegen? (weitere Fehlermeldungen kommen übrigens nicht). Compilerversion von g++ ist übrigens "g++ (GCC) 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)"
-
return (*in_t.template get<0>())(in_c->getCuboid(), in_t.template get<1>());... geht es so?

-
Ja, wirklich herzlichen Dank, das funktioniert so (und ganz ehrlich: ich wäre nie im Leben darauf gekommen, dass man das so zum Laufen bekommt.
).
-
Sollte im Standard bei 14.2/5 und 14.2/4 stehen ...
-
Ich habe ein wenig gegooglet (wenn ich gezielt nach den Punkten von (D)Evil suche, finde ich auch etwas), warum das so implementiert wurde. Jetzt wird mir zumindest die Intention dahinter klar

Um nicht einen neuen Thread zu starten: auf ein weiteres Problem bin ich noch gestoßen beim Versuch meinen Code auf Linux zu portieren:
template <class _T> class TValueController { protected: _T& mValue; virtual void correctValue() = 0; // ... }; template <class _T> class TMinMaxValueController : public TValueController<_T> { protected: _T mMin, mMax; virtual void correctValue() { if ((*this)<mMin) { this->mValue=mMin; // Zeile 94 } // ... } //... };Hier beschwert sich der Compiler mit folgender Fehlermeldung:
src/TValueController.h:94: Fehler: »mValue« wurde in diesem Gültigkeitsbereich nicht definiertIch brauche nicht zu erwähnen, dass ein bekannter Windows-Compiler den Code einwandfrei schluckte

Daher: ich bitte nochmal um Hilfe.
-
if ((*this) < mMin) TValueController<_T>::mValue = mMin; else if ((*this) > mMax; TValueController<_T>::mValue = mMax;evtl. sollte das gehen ...
-
Ja, danke, funktioniert.