XXX::value_type is implicitly a typename -implicit typename is deprecated



  • template< typename T >
    class CbVectorAllocator{  
    public:
       typedef typename CbVector<T>::value_type          value_type;
       typedef typename CbVector<value_type>::size_type  size_type;
    public:
       CbVectorAllocator() {}
       virtual ~CbVectorAllocator() {}
        bool alloc(  CbVector< value_type >& src
                  , const size_type& dataSize 
                  , const value_type& value=value_type() ) = 0;
    ...
    };
    
    template< typename T >
    class CbVectorAllocatorStd : public CbVectorAllocator<T>
    {
    public:
       CbVectorAllocatorStd() : CbVectorAllocator<value_type>() 
       {
    
       }
       /*==========================================================*/
       bool alloc(  CbVector< value_type >& src
                  , const size_type& dataSize 
                  , const value_type& value=value_type() )
       {
          return this->resize(src,dataSize,value);   
       }
    ...
    };
    

    hier erhalte ich golgende warnung beim gcc3.44

    warning: 'CbVectorAllocatorStd<T>::value_type' 
             is implicitly a typename
    warning: implicit typename is deprecated, 
             please see the documentation for details10:42:54
    

    muss ich in der abgeleiteten Klasse ebenfalls die typedefs setzen???
    oder am ende in der abgeleiteten klasse immer "typename value_type" verwenden (was nict gerade zur übersichtlichkeit beisteuert). was sagt denn da der std?



  • okay. hab das ganze jetzt mit dem intel 10.1 compile rund dem cl des 2005er und 2008er getestet mit höchster warning stufe... da kommtnichts.. bei gelegenheit werde ich das noch mit dem gcc 4.x testen.

    aber generell: ist es nicht iso konform?



  • value_type und size_type sind abhängige namen. also

    typename CbVectorAllocatorStd::value_type
    //oder
    typename CbVectorAllocator<T>::value_type
    


  • Hallo,
    das ist das "Dependent-Base"-Problem. Siehe dazu:
    http://www.comeaucomputing.com/techtalk/templates/#whymembernotfound

    Kurz: Unqualifizierte Namen werden niemals in abhängigen Basisklassen, wie CbVectorAllocator<T> eine ist, gesucht.

    Du musst in der abgeleiteten Klasse also entweder qualifizieren oder aber die typedefs wiederholen.



  • "Dependent-Base"-Problem... man lernt halt nie aus.
    Und das tritt nur bei template-Basisklassen auf. Das auf der verlinkten Seite angebene Beispiel ist da sehr schoen.

    Danke!


Anmelden zum Antworten