Domanda

Sto usando C ++ per sviluppare la parte algoritmica di un'applicazione per iPhone, e sto incontrando uno strano bug. Il codice che ho, compila bene con gcc-4.2 sia su Linux, su Mac, e sul dispositivo iPhone, non solo sul simulatore, il che rende il debugging e test molto difficile.

L'errore messaggi da tentativi di compilare per il simulatore di assomigliare ad un bug noto in 4.0.x, anche se non è molto chiaro il motivo per cui dal momento che ho impostato esplicitamente gcc-4.2 sia il compilatore di default.

Per dimostrare il bug, ho preparato il seguente frammento di codice piccolo:

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 poi ha cercato di compilarlo come segue:

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 

Benche 'Sto usando gcc-4.2 per compilare per il simulatore, io sono sempre lo stesso messaggio di errore come se fossi la compilazione sotto gcc-4.0, vale a dire:

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>&)

Tutte le idee perché questo gcc-4.0.x bug insinua nel simulatore, quando in realtà si suppone che il simulatore di utilizzare gcc-4.2.x in cui questo bug è stato risolto?

È stato utile?

Soluzione

Non sono sicuro se questo è esattamente la risposta giusta, ma questo probabilmente spiega perché si sta vedendo il comportamento 4.0 durante l'uso 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

Sembra che stanno cercando di utilizzare il set 4.0 intestazione per entrambe le versioni, almeno su Snow Leopard con Xcode 3.2.

Altri suggerimenti

sarei andato con attenzione le intestazioni (STL) della biblioteca che il simulatore fa riferimento.

A volte ci sono problemi di compilazione in Xcode, forse hai un problema analogo a quello descritto qui.

UIKit SDK Errore

In questo caso è necessario specificare il compilatore appositamente per il dispositivo e il simulatore. So che questo non ha alcun senso, ma risolto il mio problema.

C'è un problema con iteratori di unordered_map non avendo costruttori predefiniti a gcc-4.0.x

http://bytes.com/topic/c/ risposte / 607.427-error-TR1-unordered_map-iteratore

L'inizializzazione sulla dichiarazione dovrebbe risolvere il problema:

for(dict::const_iterator it = c1.begin(); it != c1.end(); it++)
    std::cout << it->first << std::endl;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top