Frage

Ich bin mit C ++ dem algorithmischen Teil einer iPhone-Anwendung zu entwickeln, und ich einen seltsamen Fehler bin zu stoßen. Der Code, den ich habe, kompiliert mit gcc-4.2 sowohl auf Linux, fein auf dem Mac und auf dem iPhone Gerät, nur nicht auf dem Simulator, die nur sehr schwer Debuggen und Testen macht.

Die Fehlermeldungen von den Versuchen für den Simulator ähneln einen bekannten Fehler in 4.0.x zu kompilieren, aber das ist nicht ganz klar, warum da ich ausdrücklich gcc-4.2 eingestellt habe die Standard-Compiler sein.

, um den Fehler zu demonstrieren, ich habe folgenden kleinen Code-Schnipsel bereit:

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); 
} 

und dann versucht, es zu kompilieren wie folgt:

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 

Eventhough Ich bin mit gcc-4.2 für den Simulator zu kompilieren, erhalte ich die gleiche Fehlermeldung, als ob ich unter gcc-4.0 wurde kompilieren, nämlich:

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

Alle Ideen, warum dieser gcc-4.0.x Fehler schleicht sich in den Simulator, wenn in der Tat der Simulator soll gcc-4.2.x zu verwenden, wo dieser Fehler behoben wurde?

War es hilfreich?

Lösung

Nicht sicher, ob dies ist genau die richtige Antwort, aber dies würde wahrscheinlich erklären, warum seht sie das 4.0-Verhalten während 4.2 mit:

> 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

Es sieht aus wie sie versuchen, den 4.0-Header Satz für beide Versionen zu verwenden, zumindest auf Snow Leopard mit Xcode 3.2.

Andere Tipps

Ich würde vorsichtig die Bibliothek (STL) Header werden überprüft, die der Simulator verweist.

Manchmal gibt es Compiler Probleme in Xcode, vielleicht haben Sie ein Problem analog zu dem hier beschriebenen.

UIKit SDK Fehler

In diesem Fall müssen Sie den Compiler speziell für Geräte- und Simulator angeben. Ich weiß, dass dies keinen Sinn machen, aber es feste mein Problem.

Es gibt ein Problem mit unordered_map der Iteratoren Standardkonstruktoren in gcc-4.0.x nicht mit

http://bytes.com/topic/c/ Antworten / 607427-error-TR1-unordered_map-Iterator

Die Initialisierung bei der Deklaration sollte es beheben:

for(dict::const_iterator it = c1.begin(); it != c1.end(); it++)
    std::cout << it->first << std::endl;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top