Dav*_*fal 3 c++ templates typedef typename
当我在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();
}
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
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> &)'
Run Code Online (Sandbox Code Playgroud)
如果我将一个typedef添加到CFooVector模板,我可以获得编译和工作的代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么使用裸'typename std::vector>::iterator'声明时typedef工作不起作用?
这也编译并揭示了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();
}
Run Code Online (Sandbox Code Playgroud)
GCC 3.4想要这个 - > begin()和space,但是否则它可以在没有显式分配器类型的情况下编译代码......绝对看起来MS编译器不像它应该那么聪明......
| 归档时间: |
|
| 查看次数: |
1185 次 |
| 最近记录: |