- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在 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
最佳答案
原始代码是针对一个 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
做任何事情,它可能仍然不正确。 ,除了给它分配一个新值(将它与自身进行比较,或者通过复制它初始化的另一个迭代器进行比较是有效的,但是与非奇异迭代器进行比较,或者单独默认值构造的迭代器将是未定义的)。
关于c++ - 错误:从 long int 到非标量类型 __gnu_cxx::__normal_iterator 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11154262/
我正在尝试在 Linux (Redhat) 中运行旧的 C++ 代码。我正在使用 gcc 版本 4.1.2。这是我遇到错误的代码示例: template TP *GCVVect
这可能是一个愚蠢的错误,但我收到以下错误: error: request for member ‘speak’ in ‘it.__gnu_cxx::__normal_iterator::ope
int webServerPort = -1; void configure(std::string responseFile, callback_function call_back, std
我是一名优秀的程序员,十分优秀!