MSVC ++ ошибка компилятора C2143 - PullRequest
1 голос
/ 07 апреля 2009

Следующий фрагмент кода отвечает за загадочную ошибку компилятора 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 ++ . Я еще даже не полностью понимаю этот код. Однако цель состоит в том, чтобы реализовать векторный тип, который будет генерировать исключение, когда какой-то код пытается получить доступ к элементу вне диапазона вектора вместо того, чтобы просто возвращать неправильные значения.

Ответы [ 3 ]

3 голосов
/ 07 апреля 2009

Попробуйте

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 через указатель на вектор.

1 голос
/ 07 апреля 2009

Почему вы пытаетесь наследовать от вектора? Это вызовет у вас много проблем. Наименее из которых является то, что вектор не имеет виртуального деструктора. Это приведет к тому, что при удалении полиморфной ссылки на ваш класс будет вызван неправильный деструктор, что приведет к утечкам памяти или общему плохому поведению.

Например, следующий код не будет вызывать ~ Vec (), а будет вызывать ~ vector ().

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

Фактическая ошибка компиляции, которую вы видите, заключается в том, что вы используете синтаксис шаблона для вызова базового конструктора. Просто удалите это, и оно должно скомпилировать

Vec() : vector() {}
0 голосов
/ 22 ноября 2010

С MSDN: ошибка компилятора 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>.

...