您的位置:程序门 -> c/c++ -> c++ 语言



封装含有std::map的模板类遇到的问题,无法定义iterator


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


封装含有std::map的模板类遇到的问题,无法定义iterator[已结贴,结贴人:atlantics]
发表于:2007-02-13 14:06:18 楼主
封装一个类模板类,其中有个成员是std::map

template <class   key,class   value>
class   cmymap
{
public:
    ...
    void*   lookup(key   key);
    std::map <key,value>   mocontent;
    ...
}

template <class   key,class   value>
inline   void*   cmymap <key,value> ::lookup(key   key)
{
bool   lbresult   =   false;

cautolock   moautolock(mstraccesscritcalsection);

                  //这一行会报错
std::map <key,value> ::iterator   locontentiterator;

locontentiterator   =   mocontent.find(key);
if(locontentiterator   ==   mocontent.end())
。。。。
}
在linux下编译会提示error:   expected   `; '   before   "locontentiterator "。
不知道是什么原因,如何解决。整了两天了,请高手指点。
发表于:2007-02-13 14:10:351楼 得分:50
std::map <key,value> ::iterator   locontentiterator;
改为:
typename   std::map <key,value> ::iterator   locontentiterator;
发表于:2007-02-13 14:24:172楼 得分:0
果然能行了!能简单说一下为什么吗?我是初学者.
发表于:2007-02-13 14:31:223楼 得分:0
我找到一篇文章大概能解释它。
http://dev.yesky.com/13/2221013.shtml
一会就结帖了,感谢晨星!
发表于:2007-02-13 14:34:254楼 得分:0
依赖于模板参数的名字最好加,虽然有些编译器号称能“推断”出一些来。
发表于:2007-02-13 16:20:065楼 得分:0
晨星兄还能回答我一个问题吗?

我定义的模块类,如果将其成员函数在.cpp中实现,即使加上inline,在linux下编译时也会报
undefined   reference   to...,如果将其实现放在.h中则不会。这是什么原因呢?能否解决?(windows下好象不会有这个问题)
发表于:2007-02-13 22:35:536楼 得分:0
模板实例化都是在编译时进行,因为就跟inline函数一样,必须在每个调用点可见(不仅要声明可见,而且要定义可见)。
既使有编译器能够做到放到cpp文件中而不报错,那它肯定是内部实现中采取了特殊的把戏,其底层实质还是相当于包含了所有需要包含的。
发表于:2007-02-13 22:37:057楼 得分:0
当然,如果你只是定义了某个东西,而从来没用过它,那无所谓。
——但这只是理论上的情况,实际上你既然定义了某个东西,一般就是要用的。


快速检索

最新资讯
热门点击