Pergunta

Eu estou tendo um problema realmente desagradável com algum código que eu escrevi. Eu encontrei alguém que tinha o mesmo problema em stackoverflow e eu tentei as soluções, mas nenhum funcionou para mim.

Eu typedef vários tipos comuns STL que eu estou usando e nenhum dos outros têm qualquer problema, exceto quando tento typedef um mapa. Eu recebo um "some_file.h: 83: erro: esperado initializer antes '<' token". Erro ao incluir meu cabeçalho em um programa de teste

Aqui está a parte importante do cabeçalho (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;

A inclui em some_file.cpp são:

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

O arquivo de teste simplesmente inclui corda, vetor, e meu arquivo nessa ordem. Ele tem um método main que só faz um Olá mundo tipo de coisa.

O engraçado é que eu joguei rapidamente reunir uma classe de modelo para ver onde o problema era (substituindo o "std::map<Column..." com "hello<Column...") e ele funcionou sem problemas.

Já criei a sobrecarga operador exigido pelo mapa se você estiver usando uma classe sem um operador de '<'.

Foi útil?

Solução

Você está recebendo este problema porque o compilador não sabe o que um mapa é. Ele não sabe porque o cabeçalho mapa não foi incluído ainda. Seu cabeçalho usa os modelos STL: corda, vetor, mapa, e par. No entanto, ele não defini-los, ou ter qualquer referência ao local onde eles são definidos. A razão suas Barfs arquivo de teste no mapa e não na string ou vetor é que você inclua as cordas e vetor cabeçalhos antes some_file.h tão corda e vector são definidos, mas o mapa não é. Se você incluir cabeçalho do mapa, ele vai trabalhar, mas então ele pode reclamar par (a menos que sua implementação STL especial inclui par no cabeçalho do mapa).

Geralmente, a melhor política é a de incluir o cabeçalho padrão adequado para cada tipo que você usa no seu próprio cabeçalho. Então some_file.h deve ter, pelo menos, esses cabeçalhos:

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

A desvantagem dessa abordagem é que o pré-processador tem que carregar cada arquivo de cada vez e ir até o processamento de inclusão condicional #ifdef ... #endif, por isso, se você tem milhares de arquivos, e dezenas de inclui em cada arquivo, isso poderia aumentar o seu tempo de compilação significativamente. No entanto, na maioria dos projetos, o agravamento adicional de ter de gerir a inclusão de cabeçalho manualmente não vale a pena o ganho minúsculo em tempo de compilação. É por isso que o livro Effective STL Scott Meyers' tem "Sempre #include os cabeçalhos apropriados "como # 48 .

Outras dicas

Existe um lugar #include <map> em seu arquivo de cabeçalho?

Coloque isso lá para pelo menos ver se funciona. Você deve estar fazendo isso de qualquer maneira.

Você deve transferir parte das pessoas inclui em seu arquivo cabeçalho. Estes precisam ser colocado antes suas declarações typedef.

i.

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

Caso contrário, qualquer outra coisa, incluindo some_file.h (como seu programa principal) não sabe o que são, a menos que também coloca estes inclui antes do #include "some_file.h" incluem directiva no seu arquivo fonte do programa principal. Se você fizer isso, o problema deve ir embora.

Como várias pessoas têm apontado, o compilador é não encontrar a definição para mapa. Desde que você parecem estar incluindo o cabeçalho mapa, há 2 outras possíveis causas que eu posso pensar de:

  1. Outro arquivo de cabeçalho chamado mapa está sendo carregado em vez do cabeçalho mapa std. Eu acho que isso é improvável.
  2. Outro cabeçalho é # define'ing mapa para ser outra coisa.

Uma maneira de verificar se há qualquer um é obter o seu compilador para gerar o arquivo processado-post, ou seja, o arquivo de origem depois de ter sido executado através da C pré-processador, mas antes que ele foi compilado. Você deve então ser capaz de encontrar sua linha de ofender e ver se o tipo de mapa foi substituído por outra coisa. Você também deve ser capaz de pesquisar o backup do arquivo e ver o cabeçalho do #include opulled em.

Como você gerar o arquivo processado-post é compilador dependente -. Verificar os sinalizadores de linha de cmd na documentação para o seu compilador

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top