关于C++ typedef list<类名>:iterator iterator;出错

头文件Property.h:
#include <string>
template <class Name = string, class Type = double> class Property
{
private:
Name nam;
Type con;
public:
// Constructors
Property(const Name& name);
};

在程序Property.cpp中给出构造函数:
template <class Name, class Type>
Property< Name, Type>::Property(const Name& name, const Type& t)
{// Constructor
nam = name;
con = t;
}
头文件SimplePropertySet.h:
#include <Property.cpp>
#include <list>
#include <set>
using namespace std;

template <class N, class V> class SimplePropertySet
{
private:
N nam;
list<Property<N,V> > sl;
public:
// User can use the STL iterator
typedef list<Property<N,V> >::iterator iterator;
typedef list<Property<N,V> >::const_iterator const_iterator;
};
typedef list<Property<N,V> >::iterator iterator; 编译时出错,为什么呢?
按一楼换了名字似乎还不行

编译器跟之前同样提示:
warning C4346: “std::list<Property<Name,Type>>::iterator”: 依赖名称不是类型
1> 用“typename”为前缀来表示类型
参见对正在编译的类 模板 实例化“SimplePropertySet<N,V>”的引用
error C2144: 语法错误 : “std::iterator”的前面应有“;”
error C2208: “std::iterator”: 没有使用此类型进行定义的成员
fatal error C1903: 无法从以前的错误中恢复;正在停止编译

我怀疑可能是编译器没找到iterator的类型,该怎么做呢?

编译器已经提示了,加上typename
typedef list<Property<N,V> >::iterator iterator;
typedef list<Property<N,V> >::const_iterator const_iterator;
改为
typedef typename list<Property<N,V> >::iterator iterator;
typedef typename list<Property<N,V> >::const_iterator const_iterator;
因为list本身就是模板,在其模板参数未确定之前,也就是Property<N,V> 的具体类型没有确定之前,引用其class内部定义的type,这个type也是未知的,加上typename就是告诉编译器先不管具体类型,等模板实例化的时候再确定吧

另外,模板实现分开写,也就是写在Property.cpp中,对于大多数编译器来说,连接时会告诉找不到符号,如果不是必须隐藏实现,最好写到.h里,或者使用支持external的编译器,具体请google:c++ template external
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-27
iterator已经是一个类型了,换一个名称吧,比如:
typedef list<Property<N,V> >::iterator PropertyIterator;
typedef list<Property<N,V> >::const_iterator PropertyConstIterator;

关于C++ typedef list<类名>:iterator iterator;出错
typedef typename list<Property<N,V> >::const_iterator const_iterator;因为list本身就是模板,在其模板参数未确定之前,也就是Property<N,V> 的具体类型没有确定之前,引用其class内部定义的type,这个type也是未知的,加上typename就是告诉编译器先不管具体类型,等模板实例化的时候再确定吧 另外,模...

C++ list<int>::iterator it; 报error: expected primary-expression...
list本身是容器关键词,你再用list作为变量名会出错得吧,你改改看。

C++使用STL模板时为什么会有list iterator not dereferencable 这个...
貌似你的输出语句不对,应该是cout << "删除的第" <<t->loc << "个 : " << i << endl;

c++ 这个程序 那里错了 怎么老弹出度画框???
删除的话,需要在删除的语句之后把迭代器的值减去删除的元素的个数 for(vector<int>::iterator s=v.begin();s<v.end();s++){ if((*s)%2==0){ v.erase(s);s--;\/\/迭代器的值减去删除的元素的个数 } } for(list<int>::iterator li=l.begin();li!=l.end();li++){ if((*li...

C++一个类模板里使用迭代器的问题
编译器说的再清楚不过了 typedef list<HashedObj>::iterator Litr;'std::list<HashedObj>::iterator'前面要加'typename'指示这是一个类型的名字,因为 'std::list<HashedObj>'是dependent scope,不能自动判断其成员iterator是类型还是变量

C++ STL std::list::iterator
begin()返回的是迭代器对象,数组C是指针,它们是完全不同的两种东西,不存在这样的赋值转换,要达到你的目的,正确的写法应该是:C[1] = &(*B.begin());

有关C++ STL的两个问题(有关时间复杂度)
第一个问题:advance函数用在“随机访问迭代器”上时,时间复杂度是常数,即O(1)。所谓随机访问迭代器,简单地说就是该迭代器支持加法和减法操作符。比如,std::vector::iterator就是一种random access iterator,而std::list::iterator就不是。两者区别在于:如果你有一个vector::iterator,变量名是...

c++中 list迭代器不能自增
list<int> x;list<int>::iterator iter=x.begin(); \/\/调试一下,看看这里iter的值。因为空list的begin和插入值之后的begin返回的内容不一样 for(int i=0;i<10;i++)x.push_back(i);\/\/\/ 如果这里加 iter=x.begin() 就ok了,可以看看这时iter的值啊 \/\/\/ iter++; \/\/此处报错...

C++ list容器换了种写法就报N多错
三楼正解啊。你这样重定义了,因为你函数的.cpp文件就#include 了这两个类定位的头文件,main函数也引用了这个头文件,就重定义了,所以只要 ifndef XXX defind XXX class define endif 就可以了

关于C++中list<string>的疑问
第一个问题:words是含有5个元素的指针数组,所有指针的大小占4byte,只用来存放地址而已~,所以sizeof(*char)就是4了 所以sizeof(words)=4*5=20了 第二个问题:*itl 这样输出 求采纳

相似回答