2009-11-02 6 views
2

Je commence à connaître boost :: variant. Je pense que cet exemple devrait fonctionner.Pourquoi l'exemple boost :: variant ne fonctionne-t-il pas?

#include <boost/fusion/sequence.hpp> 
#include <boost/fusion/include/sequence.hpp> 

#include <boost/variant/variant.hpp> 
#include <string> 
#include <vector> 
#include <iostream> 
#include <boost/variant/get.hpp> 
boost::variant< bool,long,double,std::string, 
std::vector<boost::variant<bool> > > v4; 
void main() 
{ 

    std::vector<boost::variant<bool> > av (1); 
    v4= av; 
    try 
    { 
    bool b= 
    boost::get<bool> (v4[0]); // <--- this is line 20 
    std::cout << b; 


    } 
    catch (boost::bad_get v) 
    { 
    std::cout << "bad get" <<std::endl; 
    } 
} 

Je reçois une erreur de compilation:

d: \ m \ UPP \ boosttest \ main.cpp (20): erreur C2676: binaire '[': 'boost :: variante' faire es pas définir cet opérateur ou une conversion en un type acceptable pour l'opérateur prédéfini avec [ T0_ = bool, T1 = long, T2 = double, T3 = std :: string, T4 = std :: vecteur> ]

+0

Pourquoi utilisez-vous boost :: variante ? Une variante de type unique est un peu inutile, non? – alexk7

+0

En effet, je viens d'expérimenter. – Aftershock

Répondre

10

v4[0] n'est pas valide car v4 est une variante, pas un vecteur. Vous devez utiliser boost::get pour récupérer le vecteur stocké en premier. Ainsi, la ligne 20 devrait être

boost::get<bool>(boost::get<std::vector<boost::variant<bool> > >(v4)[0]);

+1

Ugh! L'homme c'est moche! – JRL

+9

Un typedef pour 'std :: vector >' aide un peu. Ne pas utiliser des variantes de vecteurs de variantes aide plus :) –

+2

topic-starter, je vous suggère d'utiliser typedefs. et, excusez-moi pour mes notes, mais il est préférable d'attraper des exceptions par référence const, soit essayer {/ ** /} catch (const boost :: bad_get & v) {/ ** /} – varnie

Questions connexes