Pergunta

Eu estou usando C ++ para desenvolver a parte algorítmica de um aplicativo para iPhone, e eu estou encontrando um erro estranho. O código que eu tenho, compila bem com gcc-4.2 tanto no Linux, no Mac, e no dispositivo iPhone, não apenas sobre o Simulator, o que torna a depuração e teste muito difícil.

As mensagens de erro das tentativas para compilar para o simulador de se assemelhar a um erro conhecido no 4.0.x, apesar de que não é muito claro porque desde que eu tenho explicitamente conjunto gcc-4.2 para ser o compilador padrão.

Para demonstrar o erro, eu preparei o seguinte pequeno trecho de código:

bug.cpp

#include <tr1/unordered_map>
#include <iostream>

/* a hash key for the visitedTrip table */
struct X {
    int x;

    X() : x(0){};
    X(int x) : x(x){};
};


typedef std::tr1::unordered_map<int,X> dict;

int main() 
{ 
    dict c1; 

    X a(0);
    X b(1);
    X c(2);

    c1[0] = a;
    c1[1] = b;
    c1[2] = c;

    dict::const_iterator it;

    for(it = c1.begin(); it != c1.end(); it++)
        std::cout << it->first << std::endl;

    return (0); 
} 

e, em seguida, tentou compilá-lo da seguinte forma:

compile.sh

#!/bin/bash

#
# Compiling for the simulator and compiling under gcc-4.0 return the same error message
#

#SUCCESS
c++-4.2 -arch i386 bug.cpp

#FAIL 
c++-4.0 -arch i386 bug.cpp

#SUCCESS
gcc-4.2 -arch i386 -c bug.cpp

#FAIL
gcc-4.0 -arch i386 -c bug.cpp

#FAIL
gcc-4.2 -arch i386 -c bug.cpp -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk 

Mesmo admitindo que estou usando gcc-4.2 para compilar para o simulador, eu estou recebendo a mesma mensagem de erro como se eu estivesse compilando sob gcc-4.0, a saber:

bug.cpp:27: error: no matching function for call to ‘Internal::hashtable_iterator<std::pair<const int, X>, false, false>::hashtable_iterator()’
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++/4.2.1/tr1/hashtable:236: note: candidates are: Internal::hashtable_iterator<Value, is_const, cache>::hashtable_iterator(const Internal::hashtable_iterator<Value, true, cache>&) [with Value = std::pair<const int, X>, bool is_const = false, bool cache = false]
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++/4.2.1/tr1/hashtable:234: note:                 Internal::hashtable_iterator<Value, is_const, cache>::hashtable_iterator(Internal::hash_node<Value, cache>**) [with Value = std::pair<const int, X>, bool is_const = false, bool cache = false]
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++/4.2.1/tr1/hashtable:232: note:                 Internal::hashtable_iterator<Value, is_const, cache>::hashtable_iterator(Internal::hash_node<Value, cache>*, Internal::hash_node<Value, cache>**) [with Value = std::pair<const int, X>, bool is_const = false, bool cache = false]
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++/4.2.1/tr1/hashtable:225: note:                 Internal::hashtable_iterator<std::pair<const int, X>, false, false>::hashtable_iterator(const Internal::hashtable_iterator<std::pair<const int, X>, false, false>&)

Todas as ideias de que esta gcc-4.0.x bugs se arrasta em simulador, quando na verdade o simulador é suposto estar usando gcc-4.2.x, onde este bug foi corrigido?

Foi útil?

Solução

Não sei se isso é exatamente a resposta certa, mas isso provavelmente explica por que você está vendo o comportamento 4.0 ao usar 4.2:

> pwd
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++
> ls -l
total 4
drwxr-xr-x  10 root  wheel  2278 10 Sep 09:32 4.0.0/
lrwxr-xr-x   1 root  wheel     5 10 Sep 09:30 4.2.1@ -> 4.0.0

Parece que eles estão tentando usar o conjunto 4.0 cabeçalho para ambas as versões, pelo menos no Snow Leopard com o Xcode 3.2.

Outras dicas

Eu seria verificar cuidadosamente a biblioteca (STL) cabeçalhos que o simulador está referenciando.

Às vezes, há problemas de compilador no Xcode, talvez você tenha um problema análogo ao descrito aqui.

UIKit SDK erro

Neste caso, você tem que especificar o compilador especificamente para o dispositivo e simulador. Eu sei que isso não faz qualquer sentido, mas fixa o meu problema.

Há um problema com iteradores de unordered_map não ter construtores padrão em gcc-4.0.x

http://bytes.com/topic/c/ respostas / 607427-error-TR1-unordered_map-iterator

A inicialização em cima declaração deve corrigi-lo:

for(dict::const_iterator it = c1.begin(); it != c1.end(); it++)
    std::cout << it->first << std::endl;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top