我在使用较新的C ++编译器(从Visual C ++ 6.0到Visual C ++ 2015)编译模板类时遇到问题。所有错误都集中在该类中的少数typedef周围。这是头文件的一个片段:
template<class Type> class Vector
{
public:
typedef Type* iterator;
typedef const Type* const_iterator;
typedef Type& reference;
typedef const Type& const_reference;
typedef size_t size_type;
Vector();
Vector( size_type Size, const_reference Object = Type() );
...
private:
VectorImpl<Type>* m_pImpl;
};
template <typename Type> Vector<Type>::Vector()
{
m_pImpl = new VectorImpl<Type>();
};
template <typename Type> Vector<Type>::Vector(Vector<Type>::size_type Size, Vector<Type>::const_reference Object)
{
m_pImpl = new VectorImpl<Type>(Size, Object);
};
...
当编译器尝试构建模板方法实现时,遇到typedef参数时会引发错误(即' Vector :: size_type Size '),我得到了一个 C2988无法识别的模板声明/ definition ”错误。在其他情况下,我收到' C2061语法错误:标识符'size_type''错误。
在模板类中使用typedef是否存在格式问题或兼容性问题?
答案 0 :(得分:0)
由于size_type
是从属类型,因此您需要将其称为typename Vector::size_type
,以使编译器确信该符号表示每种可能的Vector
专业化类型。远古的Visual C可以在没有typename
的情况下接受它(但在C ++模板的其他方面却失败了很多。)