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 »)« token

    Worin 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 definiert
    

    Ich 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.


Anmelden zum Antworten