O tipo incompleto não é permitido: stringstream

109

Por que esta linha apresenta o erro Error: incomplete type is not allowed?

stringstream ss;
pighead10
fonte
Quais arquivos de cabeçalho você incluiu?
Alan Stokes,
Estou supondo que havia um #include<stringstream>ou algo que eu deveria ter usado? #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <fstream> #include <cstdlib> #include <vector>
pighead10

Respostas:

210

#include <sstream> e use o nome totalmente qualificado, ou seja, std::stringstream ss;

Prasoon Saurav
fonte
O erro é provavelmente devido ao stringstream ser definido como um tipo genérico de algo indefinido.
mireazma
Acho que o Visual Studio às vezes permite usar stringstream sem incluir o arquivo. Talvez esta seja a causa do erro
FindOutIslamNow
40

Alguns dos cabeçalhos do sistema fornecem uma declaração de encaminhamento std::stringstreamsem a definição. Isso o torna um 'tipo incompleto'. Para corrigir isso, você precisa incluir a definição, que é fornecida no <sstream>cabeçalho:

#include <sstream>
Yakov Galka
fonte
17

Um incomplete typeerro é quando o compilador encontra o uso de um identificador que ele sabe que é um tipo, por exemplo, porque viu uma declaração antecipada dele (por exemplo class stringstream;), mas não viu uma definição completa para ele ( class stringstream { ... };).

Isso pode acontecer para um tipo que você não usou em seu próprio código, mas só está presente por meio de arquivos de cabeçalho incluídos - quando você incluiu arquivos de cabeçalho que usam o tipo, mas não o arquivo de cabeçalho onde o tipo é definido. É incomum que um cabeçalho não inclua todos os cabeçalhos de que precisa, mas não é impossível.

Para coisas da biblioteca padrão, como a stringstreamclasse, use o padrão de linguagem ou outra documentação de referência para a classe ou as funções individuais (por exemplo man, páginas Unix , biblioteca MSDN, etc.) para descobrir o que você precisa #includepara usá-lo e o que namespace para encontrá-lo, se houver. Você pode precisar pesquisar por páginas onde o nome da classe aparece (por exemplo man -k stringstream).

rakslice
fonte