Le type incomplet n'est pas autorisé: stringstream

109

Pourquoi cette ligne donne-t-elle l'erreur Error: incomplete type is not allowed?

stringstream ss;
pighead10
la source
Quels fichiers d'en-tête avez-vous inclus?
Alan Stokes
Je suppose qu'il y avait un #include<stringstream>ou quelque chose que j'aurais dû utiliser? #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <fstream> #include <cstdlib> #include <vector>
pighead10

Réponses:

211

#include <sstream> et utilisez le nom complet ie std::stringstream ss;

Prasoon Saurav
la source
L'erreur est probablement due au fait que le flux de chaînes est défini comme un type générique de quelque chose d'indéfini.
mireazma
Je pense que Visual Studio permet parfois d'utiliser stringstream sans inclure le fichier. C'est peut-être la cause de l'erreur
FindOutIslamNow
40

Certains des en-têtes système fournissent une déclaration avant std::stringstreamsans la définition. Cela en fait un «type incomplet». Pour résoudre ce problème, vous devez inclure la définition, qui est fournie dans l'en- <sstream>tête:

#include <sstream>
Yakov Galka
la source
17

Une incomplete typeerreur se produit lorsque le compilateur rencontre l'utilisation d'un identifiant qu'il sait être un type, par exemple parce qu'il a vu une déclaration avant de celui-ci (par exemple class stringstream;), mais qu'il n'a pas vu une définition complète pour lui ( class stringstream { ... };).

Cela peut se produire pour un type que vous n'avez pas utilisé dans votre propre code mais qui n'est présent que dans les fichiers d'en-tête inclus - lorsque vous avez inclus des fichiers d'en-tête qui utilisent le type, mais pas le fichier d'en-tête où le type est défini. Il est inhabituel pour un en-tête de ne pas lui-même inclure tous les en-têtes dont il a besoin, mais ce n'est pas impossible.

Pour les éléments de la bibliothèque standard, tels que la stringstreamclasse, utilisez le standard du langage ou une autre documentation de référence pour la classe ou les fonctions individuelles (par exemple man, pages Unix , bibliothèque MSDN, etc.) pour déterminer ce dont vous avez besoin #includepour l'utiliser et ce que namespace pour le trouver le cas échéant. Vous devrez peut-être rechercher des pages où le nom de la classe apparaît (par exemple man -k stringstream).

rakslice
la source