以下代码摘录导致了一个神秘的MSVC ++编译器错误:
template<class T> class Vec : public vector<T>{
public:
Vec() : vector<T>(){}
Vec(int s) : vector<T>(s){}
T& operator[](int i){return at(i); }
const T& operator[](int i)const{ return at(i);}
};
...
错误:
test.cpp(5) : error C2143: syntax error : missing ',' before '<'
test.cpp(12) : see reference to class template instantiation 'Vec<T>' being compiled
我该如何解决这个问题?
--- ---编辑
某些背景信息:
我正在尝试编译基本上从 C ++编程语言复制和粘贴的代码。我甚至还没完全理解这段代码。然而,目的是实现一个向量类型,当某些代码试图从向量的范围中访问一个项而不是仅返回不正确的值时,它会抛出异常。
答案 0 :(得分:3)
尝试
template<class T> class Vec : public vector<T>{
public:
Vec() : vector(){} // no <T>
Vec(int s) : vector(s){} // same
T& operator[](int i){return at(i); }
const T& operator[](int i)const{ return at(i);}
};
模板类的构造函数在其名称中不包含模板签名。
作为旁注,你的第二个构造函数应该是
Vec(typename vector<T>::size_type s) : vector(s){} // not necessarily int
最后,你真的不应该从vector派生,因为它有一个非虚拟析构函数。不要尝试通过指向向量的指针删除Vec。
答案 1 :(得分:1)
你为什么试图从矢量继承?这会给你带来很多问题。其中最少的是该向量没有虚拟析构函数。这将导致在删除对类的多态引用时调用错误的析构函数,这将导致内存泄漏或一般的不良行为。
例如,以下代码不会调用~Vec(),而是调用~vector()。
vector<int> *pVec = new Vec<int>();
delete pVec; // Calls ~vector<T>();
您看到的实际编译错误是因为您正在使用基本构造函数调用的模板语法。只需删除它,它应该编译
Vec() : vector() {}
答案 2 :(得分:0)
来自MSDN: Compiler Error C2143 (C++)
An unqualified call is made to a type in the Standard C++ Library:
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad; // C2143
static std::vector<char> good; // OK
这只是我的意思。您只需修改对vector<T>
的引用,将其替换为std::vector<T>
。