1

以下代码摘录负责神秘的 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

我该如何解决?

- -编辑 - -

一些上下文:

我正在尝试编译代码,基本上是从The C++ Programming Language复制和粘贴的。我什至还没有完全理解这段代码。然而,其目的是实现一个向量类型,当某些代码尝试访问向量范围之外的项目时,该向量类型将引发异常,而不是仅仅返回不正确的值。

4

3 回答 3

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

最后,你真的不应该从向量派生,因为它有一个非虚拟的析构函数。不要试图通过指向向量的指针来删除 Vec。

于 2009-04-07T13:48:43.123 回答
1

你为什么要尝试从向量继承?这会给你带来很多问题。其中最少的是该向量没有虚拟析构函数。这将导致在删除对您的类的多态引用时调用错误的析构函数,这将导致内存泄漏或一般的不良行为。

例如,以下代码不会调用 ~Vec(),而是调用 ~vector()。

vector<int> *pVec = new Vec<int>();
delete pVec;  // Calls ~vector<T>();

您看到的实际编译错误是因为您使用模板语法进行基本构造函数调用。只需删除它,它应该编译

Vec() : vector() {}
于 2009-04-07T13:47:24.703 回答
0

来自MSDN:编译器错误 C2143 (C++)

对标准 C++ 库中的类型进行了非限定调用:
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad;   // C2143
static std::vector<char> good;   // OK

这只是咬我。您只需修复对 的引用vector<T>,将它们替换为std::vector<T>.

于 2010-11-22T05:53:29.690 回答