fehler mit enable_if



  • hallo

    ich habe in dieser zeile

    typedef EnableIf< ::std::numeric_limits<unsigned long int>::max() > Sum, unsigned long int>::Type ProbabilityType;
    

    folgende fehler:

    error C2976: "EnableIf": Nicht genügend template-Argumente.
    error C2365: "Sum": Erneute Definition; vorherige Definition war "Enumerator".
    error C2062: 'unsigned long'-Typ unerwartet
    

    wobei Sum so definiert ist:

    enum
    			{
    				Sum = // ... irgendwas was aus anderen Quellen errechnet wird, alles zu Compiletime bekannt
    			};
    

    und EnableIf so:

    template<bool Condition, typename T>
    	struct EnableIf;
    	template<typename T>
    	struct EnableIf<true, T>
    	{
    		typedef T Type;
    	};
    

    ich kann fehler nicht nachempfinden. ist es vielleicht weil der binäre operator > als template-klammer interpretiert wird? ist der fehler überhaupt ein fehler nach dem standard? und wenn es das ist, wie schreibt man das richtig? ich hab bereits versucht die bedingung in klammern zu packen oder einen expliziten cast nach bool zu machen, funktionierte beides nicht.

    gruss


  • Mod

    asfdlol schrieb:

    ist es vielleicht weil der binäre operator > als template-klammer interpretiert wird?

    ja

    asfdlol schrieb:

    ist der fehler überhaupt ein fehler nach dem standard?

    ja

    asfdlol schrieb:

    ich hab bereits versucht die bedingung in klammern zu packen oder einen expliziten cast nach bool zu machen, funktionierte beides nicht.

    zeigen, nicht beschreiben.



  • camper schrieb:

    asfdlol schrieb:

    ich hab bereits versucht die bedingung in klammern zu packen oder einen expliziten cast nach bool zu machen, funktionierte beides nicht.

    zeigen, nicht beschreiben.

    typedef EnableIf< (::std::numeric_limits<unsigned long int>::max() > Sum), unsigned long int>::Type ProbabilityType;
    
    typedef EnableIf< static_cast<bool>(::std::numeric_limits<unsigned long int>::max() > Sum), unsigned long int>::Type ProbabilityType;
    

    ich hab es nun gelöst indem ich die bedingung in einen anderen unbenannten enumator gespeichert habe (diesmal jedoch mit dem makro aus <climits> da numeric_limits<T>::max() nicht zu compilezeit evaluiert werden konnte (was wahrscheinlich mit c++11 gehen würde)):

    struct Foo
    {
    	enum
    	{
    		Sum = 1
    	};
    private:
    	enum
    	{
    		MyCondition = ULONG_MAX > Sum
    	};
    public:
    	typedef EnableIf<MyCondition, unsigned long int>::Type ProbabilityType;
    };
    

    http://ideone.com/hqwH2u


  • Mod

    asfdlol schrieb:

    typedef EnableIf< (::std::numeric_limits<unsigned long int>::max() > Sum), unsigned long int>::Type ProbabilityType;
    

    das ist korrekt.



  • camper schrieb:

    asfdlol schrieb:

    typedef EnableIf< (::std::numeric_limits<unsigned long int>::max() > Sum), unsigned long int>::Type ProbabilityType;
    

    das ist korrekt.

    da hab ich wohl die compilermeldungen nicht richtig gelesen und übereilt gedacht, dass diese variante aus dem selben grund scheitert wie die allererste. ist aber wegen dem numeric_limits<T>::max() und dem fehlenden c++11 support:
    http://ideone.com/r9TI8w

    prog.cpp:17:66: error: ‘std::numeric_limits<long unsigned int>::max()’ cannot appear in a constant-expression
         typedef EnableIf< (::std::numeric_limits<unsigned long int>::max() > Sum), unsigned long int>::Type ProbabilityType;
    

    als hätten sie max nicht auch als member machen können so wie digit10 etc. 🙄

    alles klar, danke für deine hilfe.


Anmelden zum Antworten