Bonjour à tous,

J'ai découvert il y a peu les variants de boost et j'ai défini le type suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
typedef boost::make_recursive_variant<bool, int, size_t, std::string, time_t, unsigned int, unsigned long long, std::map<std::string, boost::recursive_variant_>, std::vector<std::string>>::type		Value;
J'utilisais ce type comme par exemple avec une map de type
Code : Sélectionner tout - Visualiser dans une fenêtre à part
std::map<std::string, Value>
et où j'accède aux données de la façon suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
	for (const auto &data : datas)	{
		if (data.second.type() == typeid(bool))										root[data.first] = boost::get<bool>(data.second);
		else if (data.second.type() == typeid(int))									root[data.first] = boost::get<int>(data.second);
		else if (data.second.type() == typeid(size_t))								root[data.first] = static_cast<uint64_t>(boost::get<size_t>(data.second));
		else if (data.second.type() == typeid(std::string))							root[data.first] = boost::get<std::string>(data.second);
		else if (data.second.type() == typeid(time_t))								root[data.first] = static_cast<int64_t>(boost::get<time_t>(data.second));
		else if (data.second.type() == typeid(unsigned int))						root[data.first] = boost::get<unsigned int>(data.second);
		else if (data.second.type() == typeid(unsigned long long))					root[data.first] = boost::get<uint64_t>(data.second);
		else if (data.second.type() == typeid(std::map<std::string, Value>))		root[data.first] = this->convertDataToJson(boost::get<std::map<std::string, Value>>(data.second));
		else if (data.second.type() == typeid(std::vector<std::string>))			root[data.first] = this->convertDataToJson(boost::get<std::vector<std::string>>(data.second));
		else	{
			Utils::log(Logger::LEVEL::WARN, "Type not found for key [%s]", data.first.c_str());
		}
Sauf que par la suite, je me suis rendu compte qu'en plus d'un vector de string, j'ai besoin d'un vector de map<std::string, std::string>. J'ai essayé de modifier mon type comme suit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
typedef boost::make_recursive_variant<bool, int, size_t, std::string, time_t, unsigned int, unsigned long long, std::map<std::string, boost::recursive_variant_>, std::vector<boost::recursive_variant_>>::type		Value;
mais quand je tente d'utiliser mon type Value, j'ai une erreur...


Je m'explique...
1) J'ai une classe Dto où j'ai 3 méthodes pour ajouter des data
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class	 Dto
{
/* Attributs */
	...
	std::map<std::string, Value>				_data;
 
 
/* Methods */
public:
	...
	/* Setters */
	void										setData(const std::map<std::string, std::string> &data);
	void 										setData(const std::pair<std::string, Value> &data);
	void										setData(const std::string &key, const Value &value);
2) J'ai une classe EventPlayDoneDto qui hérite de ma classe Dto où je souhaite ajouter une vecteur de strings
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class EventPlayDoneDto : public Dto
{
/* Methods */
public:
	...
	void												setPlayedFiles(const std::vector<std::string> &files);
};
 
//----------------------------------
void											EventPlayDoneDto::setPlayedFiles(const std::vector<std::string> &files)
//----------------------------------
{
	this->setData("files", files);
}
Au moment de compiler, j'obtiens l'erreur suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
eventplaydonedto.cpp: In member function ‘void EventPlayDoneDto::setPlayedFiles(const std::vector<std::basic_string<char> >&)’:
eventplaydonedto.cpp:49:30: error: no matching function for call to ‘EventPlayDoneDto::setData(const char [6], const std::vector<std::basic_string<char> >&)this->setData("files", files);
Je ne vois pas ce que j'ai raté...

Est-ce que mon nouveau type Value vous semble correct? et qu'est ce que j'ai pu faire de travers?