Domanda

Ho un problema davvero brutto con del codice che ho scritto. Ho trovato qualcun altro che ha avuto lo stesso problema su StackOverflow e ho provato le soluzioni ma nessuno ha funzionato per me.

Ho scritto diversi tipi di STL comuni che sto usando e nessuno degli altri ha alcun problema tranne quando provo a digitare una mappa. Ricevo un " some_file.h: 83: errore: inizializzatore previsto prima di "<" segno " errore durante l'inclusione della mia intestazione in un programma di test.

Ecco la parte importante dell'intestazione (some_file.h):

#ifndef SOME_FILE_H
#define SOME_FILE_H
// some syntax-correct enums+class prototypes
typedef std::string str;
typedef std::vector<Column> col_vec;
typedef col_vec::iterator col_vec_i;
typedef std::vector<Row> row_vec;
typedef row_vec::iterator row_vec_i;
typedef std::vector<str> str_vec;
typedef str_vec::iterator str_vec_i;
typedef std::vector<Object> obj_vec;
typedef obj_vec::iterator obj_vec_i;
typedef std::map<Column, Object> col_obj_map; // error occurs on this line
typedef std::pair<Column, Object> col_obj_pair;

Le inclusioni in some_file.cpp sono:

#include <utility>
#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <stdio.h>
#include <cc++/file.h>
#include "some_file.h"

Il file di test include semplicemente stringa, vettore e il mio file in questo ordine. Ha un metodo principale che fa solo un ciao mondo tipo di cose.

La cosa divertente è che ho rapidamente messo insieme una classe di modelli per vedere dove si trovava il problema (sostituendo " std :: map < Column ... " con " ciao < colonna ... ") e ha funzionato senza problemi.

Ho già creato il sovraccarico dell'operatore richiesto dalla mappa se stai usando una classe senza un operatore " < ".

È stato utile?

Soluzione

Stai riscontrando questo problema perché il compilatore non sa cosa sia una mappa. Non lo sa perché l'intestazione della mappa non è stata ancora inclusa. L'intestazione utilizza i modelli STL: stringa, vettore, mappa e amp; paio. Tuttavia, non li definisce o non ha alcun riferimento a dove sono definiti. Il motivo per cui il tuo file di test viene barcato sulla mappa e non sulla stringa o sul vettore è che includi le intestazioni di stringa e vettore prima di some_file.h in modo da definire stringa e vettore, ma la mappa no. Se includi l'intestazione della mappa, funzionerà, ma potrebbe lamentarsi della coppia (a meno che la tua specifica implementazione STL non includa la coppia nell'intestazione della mappa).

Generalmente, la migliore politica è includere l'intestazione standard corretta per ogni tipo che usi nella tua intestazione. Quindi some_file.h dovrebbe avere almeno queste intestazioni:

#include <string>
#include <map>
#include <utility> // header for pair
#include <vector>

L'aspetto negativo di questo approccio è che il preprocessore deve caricare ogni file ogni volta e passare attraverso l'elaborazione di inclusione condizionale #ifdef ... #endif , quindi se hai migliaia di file e dozzine di inclusioni in ogni file, questo potrebbe aumentare significativamente il tempo di compilazione. Tuttavia, sulla maggior parte dei progetti, l'ulteriore aggravamento di dover gestire manualmente l'inclusione dell'intestazione non vale il minuscolo guadagno nel tempo di compilazione. Ecco perché STL efficace di Scott Meyers ha " sempre #include il corretto intestazioni " come articolo # 48 .

Altri suggerimenti

C'è un #include < map > da qualche parte nel tuo file di intestazione?

Mettilo lì dentro almeno per vedere se funziona. Dovresti farlo comunque.

Dovresti spostare alcune di queste inclusioni nel tuo file di intestazione. Questi devono essere inseriti prima delle tue dichiarazioni typedef.

cioè.

#include <map>
#include <string>
#include <map>

Altrimenti, qualsiasi altra cosa incluso some_file.h (come il tuo programma principale) non saprà cosa sono a meno che non li collochi anche prima di #include "some_file.h " include direttiva nel file sorgente del programma principale. Se lo fai, il problema dovrebbe scomparire.

Come hanno sottolineato diverse persone, il compilatore non trova la definizione di mappa. Dal momento che sembra includere l'intestazione della mappa, ci sono altre 2 possibili cause che mi vengono in mente:

  1. Un altro file di intestazione chiamato map viene caricato invece dell'intestazione std map. Penso che sia improbabile.
  2. Un'altra intestazione è # definendo la mappa come qualcos'altro.

Un modo per verificare l'uno o l'altro è far sì che il compilatore generi il file post-elaborato, ovvero il file sorgente dopo che è stato eseguito attraverso il pre-processore C ma prima che sia stato compilato. Dovresti quindi essere in grado di trovare la tua linea offensiva e vedere se il tipo di mappa è stato sostituito con qualcos'altro. Dovresti anche essere in grado di cercare il backup del file e vedere in quale intestazione è stato inserito #include.

La modalità di generazione del file postelaborato dipende dal compilatore. Controlla i flag della linea cmd nei documenti per il tuo compilatore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top