当我在 Visual Studio 2005 中编译此代码时:
template <class T>
class CFooVector : public std::vector<CFoo<T>>
{
public:
void SetToFirst( typename std::vector<CFoo<T>>::iterator & iter );
};
template <class T>
void CFooVector<T>::SetToFirst( typename std::vector<CFoo<T>>::iterator & iter )
{
iter = begin();
}
我收到这些错误:
c:\home\code\scantest\stltest1\stltest1.cpp(33) : error C2244: 'CFooVector<T>::SetToFirst' : unable to match function definition to an existing declaration
c:\home\code\scantest\stltest1\stltest1.cpp(26) : see declaration of 'CFooVector<T>::SetToFirst'
definition
'void CFooVector<T>::SetToFirst(std::vector<CFoo<T>>::iterator &)'
existing declarations
'void CFooVector<T>::SetToFirst(std::_Vector_iterator<_Ty,_Alloc::rebind<_Ty>::other> &)'
如果我向 CFooVector 模板添加 typedef,我就可以编译和运行代码:
template <class T>
class CFooVector : public std::vector<CFoo<T>>
{
public:
typedef typename std::vector<CFoo<T>>::iterator FooVIter;
void SetToFirst( FooVIter & iter );
};
template <class T>
void CFooVector<T>::SetToFirst( FooVIter & iter )
{
iter = begin();
}
我的问题是,为什么 typedef 在使用裸机时起作用'typename std::vector>::iterator'
声明没起作用?
这也能编译并揭示 VC++ 混乱的根源——分配器类型。显然,VS 类之外选择了不同的默认值。或者它可能无法识别它们是相同的。
在 VS2008(按原样)和 VS2003(>> 之间有空格)上编译
template <class T>
class CFoo
{
public:
T m_t;
};
template <class T>
class CFooVector : public std::vector<CFoo<T>>
{
public:
void SetToFirst(typename std::vector<CFoo<T>, typename CFooVector::_Alloc>::iterator & iter);
};
template <class T>
void CFooVector<T>::SetToFirst( typename std::vector<CFoo<T>, typename CFooVector::_Alloc>::iterator & iter )
{
iter = begin();
}
GCC 3.4 想要 this->begin() 和 space,但否则它可以在没有显式分配器类型的情况下编译代码...绝对看起来 MS 编译器没有应有的那么智能...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)