Błąd "<< operator nie pasuje do argumentów funkcji"

0

Od razu wrzucę funkcję, która modyfikuje plik xml, czyli prosty save game

void Player::UpdatePlayerDataXML( void )
{
	std::ifstream file( "pliki/player.xml" );
	std::string xmlString( (std::istreambuf_iterator<char>( file )), std::istreambuf_iterator<char>() );
	rapidxml::xml_document<> doc;
	doc.parse<0>( &xmlString[0] );

	rapidxml::xml_node<>* root = doc.first_node( "player" );
	root->first_node( "health" )->value( std::to_string( m_healthPoints ).c_str() );
	root->first_node( "maxHealth" )->value( std::to_string( m_maxHealthPoints ).c_str() );
	root->first_node( "experiencePoints" )->value( std::to_string( m_experiencePoints ).c_str() );
	root->first_node( "monstersKilled" )->value( std::to_string( m_monstersKilled ).c_str() );
	root->first_node( "pistolAmmunition" )->value( std::to_string( m_pistolAmmunition ).c_str() );
	root->first_node( "damage" )->value( std::to_string( m_damage ).c_str() );
	root->first_node( "position_x" )->value( std::to_string( m_position.x ).c_str() );
	root->first_node( "position_y" )->value( std::to_string( m_position.y ).c_str() );

	std::ofstream outFile( "pliki/player.xml" );
	outFile << doc;
	outFile.close();
}

Problem pojawią się w tym miejscu, visual studio podkreśla na czerwono błąd:

outFile << doc;

żaden operator << nie pasuje do tych argumentów funkcji
typy operandów std::ofstream << rapidxml::xml_document<char>

Tak wyglądają moje dyrektywy include

#include <iostream>
#include <fstream>
#include <string>
#include "rapidxml/rapidxml.hpp"

Po próbie skompilowania:

1>C:\Programming projects\Wanderer\sdlproject\Player.cpp(98,16): error C2679: dwuargumentowy "<<": nie znaleziono żadnego operatora, który przyjmuje prawostronny operand typu "rapidxml::xml_document<char>" (lub nie istnieje akceptowalna konwersja)
1

Typ rapidxml::xml_document<> nie ma przygotowanego operatora ostream & <<

Im bardziej złożone typy, tym coraz rzadziej miewają. Może u niego do zapisu do sterama jest metoda ?

0

Coś jest nie tak z wersją rapidxml, która nie jest kompaktybilna z najnowszymi kompilatorami. Będę chyba musiał zmienić coś bezpośrednio w plikach .hpp rapida... jakieś sugestie?

0
Krwawy Ork napisał(a):

Coś jest nie tak z wersją rapidxml, która nie jest kompaktybilna z najnowszymi kompilatorami. Będę chyba musiał zmienić coś bezpośrednio w plikach .hpp rapida... jakieś sugestie?

a to my nie wiemy. Dałeś kod fragmetaryczny, bez rozbiegówki

Z operatrem << jest tak, że ujawnia się lub nie zależnie od kolejności headerów - tak jest (był *) guardowany w swoich miejscach deklaracji. Sugestia: w momencie includowania tego parsera, stream jest jeszcze nie wprowadzony

*) z moich lat większej aktywności

1

Podjąłem decyzję, że przejdę na inną bibliotekę w której będę używał JSON do operacji na plikach gry.

1

Kolega idzie z duchem czasu XML jest passé , brawo !

0
Adamek Adam napisał(a):

Kolega idzie z duchem czasu XML jest passé , brawo !

Hype Driven Development ?

Jak wszyscy będą pluli na podłogę, i będzie passé nie pluć ?

0

Z wielu możliwych dróg wybrał i tak nie najgorzej.
Bo OP mógł stwierdzić XML nie działa zrobię nowy wspaniały format w postaci pliku binarnego ;)

1
ZrobieDobrze napisał(a):

Typ rapidxml::xml_document<> nie ma przygotowanego operatora ostream & <<

Im bardziej złożone typy, tym coraz rzadziej miewają. Może u niego do zapisu do sterama jest metoda ?

Według dokumentacji ma.
Niestaty godbolt nie wspiera tej biblioteki.

Stawiam na to, że kolega zapotniał zrobić:

#include <rapidxml_print.hpp>

Z ciekawości, spróbowałem użyć tej biblioteki.

  1. Nie kompiluje się, z powodu złej kolejności symboli (braku deklaracji przed użyciem)
  2. API jest delikatne i uciążliwe, żeby dodać jeden node trzeba użyć dwóch funkcji:
xml_document<> doc;
xml_node<> *node = doc.allocate_node(node_element, "a", "Google");
doc.append_node(node);
  1. nie widzę testów, ani nic co przypomina Continues Integration (co wyjaśnia problemy z budowaniem)

Po naprawieniu nagłówka, przetestowałem na takim kodzie:

#include "rapidxml.hpp"
#include "rapidxml_print.hpp"

#include <iostream>
#include <string>

void fillDoc(rapidxml::xml_document<>& doc)
{
    using rapidxml::node_element;
    auto root = doc.allocate_node(node_element, "player");
    doc.append_node(root);
    root->append_node(doc.allocate_node(node_element, "half", "31"));
    root->append_node(doc.allocate_node(node_element, "position_x", "11"));
    root->append_node(doc.allocate_node(node_element, "position_y", "323"));
}

int main()
{
    rapidxml::xml_document<> doc;
    fillDoc(doc);
    std::cout << doc << '\n';
}

i działa (address sanitizer i UB sanitizer nic nie znalazł).
Wynik to:

<player>
	<half>31</half>
	<position_x>11</position_x>
	<position_y>323</position_y>
</player>

Podsumowując, poszukałbym czegoś lepszego. pgixml użwyam i działa dobrze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1