2

Linux(Redhat)で古いC++コードを実行しようとしています。gccバージョン4.1.2を使用しています。これがエラーが発生するコードサンプルです:

           template <class TP> TP *GCVVector<TP>::Find(const TP &Obj)
        {
        #ifdef WIN32
                using namespace std;
                typedef typename vector<TP>::iterator Viterator;
        #else
        #ifdef __HP_aCC 
                using namespace std;
                typedef typename vector<TP>::iterator Viterator;
        #else
                using namespace std;
                typedef typename std::vector<TP>::iterator Viterator;
        #endif
        #endif

                Viterator pCurrent =NULL ;

私が得ているエラーはこれです:

         /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVVector.h: In member          function âTP* GCVVector<TP>::Find(const TP&) [with TP = GCVAsso<GCVString, GCVString>::KeyNode]â:
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVAsso.h:165:   instantiated from âbool GCVAsso<KTP, VTP>::Add(KTP, VTP) [with KTP = GCVString, VTP = GCVString]â
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVTransformationServices.h:69:   instantiated from here
         /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVVector.h:398: error: conversion from âlong intâ to non-scalar type â__gnu_cxx::__normal_iterator<GCVAsso<GCVString, GCVString>::KeyNode*, std::vector<GCVAsso<GCVString, GCVString>::KeyNode, std::allocator<GCVAsso<GCVString, GCVString>::KeyNode> > >â requested
           /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVAsso.h:165:   instantiated from âbool GCVAsso<KTP, VTP>::Add(KTP, VTP) [with KTP = GCVString, VTP = GCVString]â
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVTransformationServices.h:69:   instantiated from here
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVVector.h:403: error: no match for âoperator=â in âpCurrent = GCVVector<TP>::BinarySearch [with TP = GCVAsso<GCVString, GCVString>::KeyNode](0l, (GCVVector<TP>::GetSize [with TP = GCVAsso<GCVString, GCVString>::KeyNode]() - 1l), ((const GCVAsso<GCVString, GCVString>::KeyNode&)((const GCVAsso<GCVString, GCVString>::KeyNode*)Obj)))â
        /usr/lib/gcc/x86_64-redhat-   linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator.h:634: note: candidates are: __gnu_cxx::__normal_iterator<GCVAsso<GCVString, GCVString>::KeyNode*, std::vector<GCVAsso<GCVString, GCVString>::KeyNode, std::allocator<GCVAsso<GCVString, GCVString>::KeyNode> > >& __gnu_cxx::__normal_iterator<GCVAsso<GCVString,         GCVString>::KeyNode*, std::vector<GCVAsso<GCVString, GCVString>::KeyNode, std::allocator<GCVAsso<GCVString, GCVString>::KeyNode> > >::operator=(const __gnu_cxx::__normal_iterator<GCVAsso<GCVString, GCVString>::KeyNode*, std::vector<GCVAsso<GCVString, GCVString>::KeyNode, std::allocator<GCVAsso<GCVString, GCVString>::KeyNode> > >&)
        make[2]: ***    [CMakeFiles/GCVCore.dir/trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVTransformationServices.o] Error 1
        make[1]: *** [CMakeFiles/GCVCore.dir/all] Error 2
4

2 に答える 2

3

元のコードは、生のポインターであるSTLに対して記述されているstd::vector<T>::iteratorため、NULLに初期化することができます(また、初期化する必要があります)。

完全な互換性を得るには、行を次のように変更します

Viterator pCurrent = Viterator();

C ++ 11では、次を使用できます

Viterator pCurrent{};

完全な互換性とは、ここでViteratorは単なるポインタである可能性があることを意味します。このような場合、デフォルトで作成された値に明示的に設定すると、NULLに設定されます。以下はそれを示す簡単な例です。

#include <iostream>

typedef void * Iterator;

int main(int, char**)
{
  Iterator v1, v2=Iterator();
  std::cout << "uninitialized pointer: " << v1 << "\ninitialized pointer: " << v2 << std::endl;
}

出力は次のとおりです。

uninitialized pointer: 0x7fff5fc01052
initialized pointer: 0

新しい値を割り当てる以外に、プログラムが何かを行う場合、プログラムはまだ正しくない可能性があることに注意してくださいpCurrent(それ自体、またはコピーによって初期化された別のイテレータと比較することは有効ですが、非特異イテレータと比較する、または個別にデフォルト値で構成されたイテレータは未定義になります)。

于 2012-06-22T10:33:49.017 に答える
0

イテレータは数値ではなく、ほとんどの場合、コンストラクタパラメータとして数値を受け取らないオブジェクトです。

行を次のように置き換えるだけです

Viterator pCurrent = Viterator();

現在のコードと同じように誤動作します。

于 2012-06-22T10:17:53.947 に答える