2017-08-10 4 views
0

J'essaie de comprendre la variante et le modèle récursifs boost. Pour le code ci-dessous, je reçois une erreur de compilation desBooster la variante récursive avec le modèle C++

cannot convert argument 1 from 'std::vector<std::string,std::allocator<_Ty>>' to 'const Boost::variant<boost::detail::variant::recursive_flag<T0>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> &'

erreur semble provenir de GetVarValue() fonction

Selon mon undertanding je peux avoir une classe avec _default: qui peut être vecteur d'int, chaîne, bool, double, vecteur de int/string/bool/double droit?

typedef boost::make_recursive_variant< 
     int, 
     std::string, 
     bool, 
     double, 
     std::vector<boost::recursive_variant_> >::type TokenValueType; 


    template<class T> 
    class VectorToken : public Token 
    { 
    private: 

     string _name; 

     vector<T> _default; 

    public: 
     VectorToken(string name, vector<T> defaultVal) 
      : _name(name) 
     { 
      _default = defaultVal; 
     } 

     virtual TokenValueType GetVarValue() 
     { 
      return _default; <-- _default (vector<string>) doesn't like TokenValueType ? 
     } 
    }; 

    main() 
    { 
     vector<string> tempvec = {"ABC", "LMN", "PQR"}; 
     VectorToken<string> t4 = VectorToken<string>::VectorToken("VECTORSTR", tempvec); 
    } 

L'erreur disparaît quand j'écris principale comme ceci:

main() 
{ 
    vector<TokenValueType> tempvec = { string("ABC"), string("LMN"), string("PQR") }; 
    VectorToken<TokenValueType> t4 = VectorToken<TokenValueType>::VectorToken("VECTORSTR", tempvec); 

} 

Répondre

0

je simplifier ce type:

typedef boost::make_recursive_variant< 
    int, 
    std::string, 
    std::vector<boost::recursive_variant_> >::type TokenValueType; 

Cela devrait être suffisant pour l'expliquer.

TokenValueType est pas une variante sur (vecteur de int, vecteur de chaîne, vecteur de vecteur de TokenValueType).

C'est un vecteur sur (int ou string ou TokenValueType).

Voici un MCVE avec vos erreurs de syntaxe corrigées et une ligne a changé:

return std::vector<TokenValueType>(_default.begin(), _default.end());