von unary_function erben



  • template< typename path_type >
    	class path_rule: public std::unary_function< const path_type&, bool >
    	{
    		public:
    			inline result_type operator()(argument_type) const = 0;
    	};
    

    Warum meint der Compiler, result_type und argument_type seien nicht definiert?


  • Mod

    Warum meint der Compiler, result_type und argument_type seien nicht definiert?

    Das bedeutet, result_type und argument_type sind nicht definiert 😃 .

    Sind sie auch nicht, denn ich sehe nirgends die Definition. Was soll das sein? Falls du damit die Templateparameter der unary_function meinst: Die hast du bei dir ja const path_type& und bool genannt.



  • die typedefs aus der Basisklasse werden nciht vererbt, was du aber anzunehmen scheinst.



  • struct base
    {
    		typedef bool test_type;
    };
    
    class derived: public base
    {
    	public:
    
    		inline test_type test2()
    		{
    			return true;
    		}
    };
    

    Mhmmm ... und warum kompiliert das anstandslos?



  • Mhmm war natĂŒrlich Unsinn ... Danke fĂŒr den Hinweis.



  • template <typename T>
    struct base
    {
    		typedef T test_type;
    };
    
    class derived: public base<bool>
    {
    	public:
    
    		inline test_type test2()
    		{
    			return true;
    		}
    };
    

    Wobei das auch kompiliert oO Was ist da los?


  • Mod

    Entschuldige, wusste nicht, dass argument_type und result_type öffentliche typedefs sind. Die werden schon vererbt, aber bei Templates muss man dann noch explizit sagen, dass es eine Typenbezeichnung ist:

    template <typename T>
    struct base
    {
            typedef T test_type;
    };
    
    template<typename N> class derived: public base<N>
    {
        public:
    
      inline typename base<N>::test_type test2()
            {
                return true;
            }
    };
    

    Wenn du das typename weglĂ€sst, bekommst du genau dein Problem, weil dann nicht klar ist, was test_type ist, denn dazu mĂŒsste man N im voraus kennen:

    template <typename T>
    struct base
    {
            typedef T test_type;
    };
    
    template<typename N> class derived: public base<N>
    {
        public:
    
      inline test_type test2()
            {
                return true;
            }
    };
    


  • fleisig schrieb:

    template <typename T>
    struct base
    {
    		typedef T test_type;
    };
    
    class derived: public base<bool>
    {
    	public:
    
    		inline test_type test2()
    		{
    			return true;
    		}
    };
    

    Wobei das auch kompiliert oO Was ist da los?

    sicherlich, weil du den msvc nimmst?!
    der "kann" das nÀmlich.

    bb



  • pumuckl schrieb:

    die typedefs aus der Basisklasse werden nciht vererbt, was du aber anzunehmen scheinst.

    Aber ist nicht der einzige Sinn von unary/binary_function genau diese typedefs zur VerfĂŒgung zu stellen?

    template< typename path_type >
    	class path_rule: public std::unary_function< const path_type&, bool >
    	{
    		public:
    			inline typename std::unary_function< const path_type&, bool >::result_type
    					operator()(typename std::unary_function< const path_type&, bool >::argument_type) const
    			{
    
    			}
    	};
    

    So kompiliert es natĂŒrlich ... wirklich was gekommt hab ich damit aber auch nicht oO



  • unskilled schrieb:

    sicherlich, weil du den msvc nimmst?!
    der "kann" das nÀmlich.

    g++ 4.4.3



  • template<typename _Arg, typename _Result>
        struct unary_function
        {
          typedef _Arg argument_type;   ///< @c argument_type is the type of the
                                        ///     argument (no surprises here)
    
          typedef _Result result_type;  ///< @c result_type is the return type
        };
    

    Mein Problem ist absolut analog zu dem test - Beispiel. Ich versteh einfach nicht, warum test kompiliert und das Original nicht??


  • Mod

    Der Unterschied ist, dass bei dir die erbende Klasse selbst ein Template ist und der typedef von diesem Templateparameter abhĂ€ngt. Das hast du bei deiner Testklasse so nicht gemacht. Siehe meinen vorherigen dafĂŒr wie dein Testfall aussehen muss um den Fehler zu zeigen und wie man den Fehler behebt.


Log in to reply