2016-04-19 4 views
1

ich auf einem C++ Programm über STL mit der neuesten Version von Xcode arbeitete, und ich erhalte die Fehlermeldung „Unknown Typname‚ubResultData‘“ und „Unknown Typname‚ubFirstArgument "". Ich habe versucht, das Programm mit Standard unary_function und binary_function neu zu schreiben, und die Fehler blieben gleich. Dann baute ich das Progamm mit VS2010 und VS2013, und es baute erfolgreich. Was ist los mit dem Programm?Xcode7: unbekannt Typname Fehler in einem grundlegenden C++ Programm

Die Fehler sind in der letzten Zeile der Klasse binder2ND.

#include <iostream> 
#include <vector> 
using namespace std; 

template<typename InputIterator, typename Predicator> 
inline int countIF(InputIterator First, InputIterator Last, Predicator Pred){ 
    int count = 0; 
    for (; First != Last; ++First) { 
     if(Pred(*First))++count; 
    } 

    return count; 
} 

template<typename Arg1, typename Result> 
struct UnaryBase{ 
    typedef Arg1 ubFirstArgument; 
    typedef Result ubResultData; 
}; 

template<typename Arg1, typename Arg2, typename Result> 
struct BinaryBase{ 
    typedef Arg1 bbFirstArgument; 
    typedef Arg2 bbSecondArgument; 
    typedef Result bbResultData; 
}; 

template<typename T> 
struct LESS:public BinaryBase<T, T, bool>{ 
    bool operator()(const T& Left, const T& Right)const{ 
     return (Left < Right); 
    } 
}; 

template<typename BinOP> 
class binder2ND:public UnaryBase<typename BinOP::bbFirstArgument, typename BinOP::bbResultData>{ 
protected: 
    BinOP OP; 
    typename BinOP::bbSecondArgument Arg2; 
public: 
    binder2ND(const BinOP& Oper, const typename BinOP::bbSecondArgument& valRight):OP(Oper),Arg2(valRight){} 
    ubResultData operator()(const ubFirstArgument &ubArg1)const{return OP(ubArg1,Arg2);} 
}; 

template<typename BinOP, typename rightVal> 
binder2ND<BinOP> bind2ND(const BinOP& OP, const rightVal& vRight){ 
    return binder2ND<BinOP>(OP, vRight); 
} 

int main(){ 
    vector<int> myVec; 
    for (int i = 0; i < 50; ++i) { 
     myVec.push_back(rand()%100); 
    } 

    int countNUm = countIF(myVec.begin(), myVec.end(), bind2ND(LESS<int>(), 30)); 
    cout << "Numbers=" << countNUm << endl; 

    return 0; 
} 
+2

Ich weiß, dass Fehler und Warnungen, wenn Sie Vorlagen haben, langatmig sein können, aber bitte alle, wortwörtlich und in vollem Umfang und unbearbeitet. –

+0

Danke für Ihren Vorschlag. Das sind genau die Fehler, die ich bekommen habe, und ich kopiere sie einfach ab. Und der Ort befindet sich in der letzten Zeile der Klasse binder2ND. –

+0

Fyi, [gcc fördert den gleichen Fehler] (http://coliru.stacked-crooked.com/a/82ddccaf5d9cebd6) als clang (deine xcode toolchain, falls du das nicht wusstest). – WhozCraig

Antwort

0

Ich erinnere mich nicht die genaue Formulierung aus dem Standard, aber hier ist der vereinfachte Code, der das gleiche Verhalten wie bei Ihnen zeigt:

template <typename T> struct A { 
    typedef T X; 
}; 

template <typename T> struct B: public A<T> { 
    X x(void) { return 5; } 
}; 

Und hier ist die Version, die ohne Fehler kompiliert:

template <typename T> struct A { 
    typedef T X; 
}; 

template <typename T> struct B: public A<T> { 
    typename A<T>::X x(void) { return 5; } 
}; 

Also im Grunde müssen Sie genau angeben, woher dieser Typ kommt.

Es sieht aus wie VS * Compiler ein bisschen toleranter als gcc oder Klappern sind. :)