Salut, alors j'ai une classe qui contient un object de type std::istream&, cette classe décompresse simplement des données en mémoire à l'aide d'un stringstream.
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
 void decompress_stdin(void)
    {
      std::stringstream output;
      output<<buffer;
      int i, out_len;
      char *buffer, *output_buffer;
      i = output.str().size();
 
      /* allocate input and output buffers */
      buffer = new char[MAX_COMPRESSED_LENGTH];
      output_buffer = new char[MAX_DECOMPRESSED_LENGTH];
 
      /* read input from stdin */
      if (i == MAX_DECOMPRESSED_LENGTH)
      {
          std::cerr<<"ERROR: Input is too long!"<<std::endl;
          return;
      }
      buffer = output.str().c_str();
      output.str("");
      /* make decompression */
      out_len = utf16_decompress((u8 *)buffer, i, (u16 *)output_buffer);
      delete[] buffer;
      output.str(std::string(output_buffer));
      buffer = output;
      delete[] output_buffer;
    }

Jusque là ça compile, j'arrive bien à extraire les données du stream, les mettre en mémoire, décompresser et ensuite les remettre dans le stream.

Ce que je voudrais faire c'est ensuite, mettre les données décompressée du stream de cette classe dans un autre type de flux. (par exemple un ifstream)

J'ai donc redéfini l'opérateur >>

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
std::istream& operator>>(std::istream& in) {
        decompress_stdin();
        in = buffer;
        return in;
    }

Ce code-ci ne compile pas et celui là :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
std::istream& operator>>(std::istream& in) {
        decompress_stdin();
        std::stringstream input;
        input<<buffer;
        in = input;
        return in;
    }

Ne compile pas non plus.

Voici l'erreur que gcc me renvoie :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
||=== Build: Debug in ODFAEG (compiler: GNU GCC Compiler) ===|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/actionMap.h|85|warning: "/*" within comment [-Wcomment]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/application.h|176|warning: "/*" within comment [-Wcomment]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h||In member function ‘void odfaeg::OTextArchive::compress_stdin()’:|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h|68|warning: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h|81|warning: invalid user-defined conversion from ‘std::stringstream {aka std::basic_stringstream<char>}’ to ‘char*’ [-fpermissive]|
/usr/include/c++/4.8/bits/basic_ios.h|115|note: candidate is: std::basic_ios<_CharT, _Traits>::operator void*() const [with _CharT = char; _Traits = std::char_traits<char>] <near match>|
/usr/include/c++/4.8/bits/basic_ios.h|115|note:   no known conversion for implicit ‘this’ parameter from ‘void*’ to ‘char*’|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h|55|warning: variable ‘out_len’ set but not used [-Wunused-but-set-variable]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h||In member function ‘void odfaeg::ITextArchive::decompress_stdin()’:|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h|333|warning: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h|339|warning: invalid user-defined conversion from ‘std::stringstream {aka std::basic_stringstream<char>}’ to ‘char*’ [-fpermissive]|
/usr/include/c++/4.8/bits/basic_ios.h|115|note: candidate is: std::basic_ios<_CharT, _Traits>::operator void*() const [with _CharT = char; _Traits = std::char_traits<char>] <near match>|
/usr/include/c++/4.8/bits/basic_ios.h|115|note:   no known conversion for implicit ‘this’ parameter from ‘void*’ to ‘char*’|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h|319|warning: variable ‘out_len’ set but not used [-Wunused-but-set-variable]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h||In member function ‘std::istream& odfaeg::ITextArchive::operator>>(std::istream&)’:|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../../../include/odfaeg/Core/archive.h|508|error: use of deleted function ‘std::basic_istream<char>& std::basic_istream<char>::operator=(const std::basic_istream<char>&)’|
/usr/include/c++/4.8/istream|58|note: ‘std::basic_istream<char>& std::basic_istream<char>::operator=(const std::basic_istream<char>&)’ is implicitly deleted because the default definition would be ill-formed:|
/usr/include/c++/4.8/istream|58|error: use of deleted function ‘std::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)’|
/usr/include/c++/4.8/bits/basic_ios.h|66|note: ‘std::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)’ is implicitly deleted because the default definition would be ill-formed:|
/usr/include/c++/4.8/bits/ios_base.h|789|error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private|
/usr/include/c++/4.8/bits/basic_ios.h|66|error: within this context|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/image.hpp|40|warning: declaration ‘class sf::InputStream’ does not declare anything [enabled by default]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/listener.h||In member function ‘void odfaeg::Listener::connect(std::string, odfaeg::Command)’:|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/listener.h|23|warning: left operand of comma operator has no effect [-Wunused-value]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/listener.h|23|warning: right operand of comma operator has no effect [-Wunused-value]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../Graphics/2D/../../Math/computer.h|269|warning: comparison between signed and unsigned integer expressions [-Wsign-compare]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../Graphics/2D/../../Math/computer.h|286|warning: comparison between signed and unsigned integer expressions [-Wsign-compare]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../Graphics/2D/../../Math/computer.h|288|warning: comparison between signed and unsigned integer expressions [-Wsign-compare]|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../Graphics/2D/entity.h||In member function ‘bool odfaeg::g2d::Entity::removeAttribute(std::string)’:|
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../Graphics/2D/entity.h|103|warning: no return statement in function returning non-void [-Wreturn-type]|
||=== Build failed: 4 error(s), 15 warning(s) (0 minute(s), 4 second(s)) ===|

Pourquoi est ce que ma fonction decompress compile bien et que en faisant la même chose dans ma fonction operator>> ça ne compile plus ???

Ai je chopé une mauvaise version de la STL ???

Ce code devrait compilé sans problème non ?