недопустимое использование имени шаблона 'x' без списка аргументов - PullRequest
0 голосов
/ 13 июня 2011

Эта проблема возникла при попытке скомпилировать пример программы из Принципов и практики программирования Страуструпа с использованием C ++.Я в главе 12, где он начинает использовать FLTK.Я получаю ошибки компилятора в графическом и графическом коде поддержки.В частности, строки 140 и 141 Graph.h:

error: invalid use of template-name 'Vector' without an argument list  
error: ISO C++ forbids declaration of 'parameter' with no type  


template<class T> class Vector_ref {  
    vector<T*> v;  
    vector<T*> owned;  
public:  
    Vector_ref() {}  
    Vector_ref(T& a) { push_back(a); }  
    Vector_ref(T& a, T& b);  
    Vector_ref(T& a, T& b, T& c);  
    Vector_ref(T* a, T* b = 0, T* c = 0, T* d = 0)  
    {  
        if (a) push_back(a);  
        if (b) push_back(b);  
        if (c) push_back(c);  
        if (d) push_back(d);  
    }  

    ~Vector_ref() { for (int i=0; i<owned.size(); ++i) delete owned[i]; }  

    void push_back(T& s) { v.push_back(&s); }  
    void push_back(T* p) { v.push_back(p); owned.push_back(p); }  

    T& operator[](int i) { return *v[i]; }  
    const T& operator[](int i) const { return *v[i]; }  

    int size() const { return v.size(); }  

private:    // prevent copying  
    Vector_ref(const Vector&);  <--- Line 140!
    Vector_ref& operator=(const vector&);  
};  

Полный заголовок и соответствующий код поддержки графики можно найти здесь:
http://www.stroustrup.com/Programming/Graphics/

Помимо исправления кодаМожет кто-нибудь, пожалуйста, пролить свет на то, что здесь происходит на простом английском языке.Я только начал изучать шаблоны, поэтому у меня есть смутная идея, но она все еще недоступна.Спасибо миллион,

1 Ответ

7 голосов
/ 13 июня 2011
Vector_ref(const Vector&);  <--- Line 140!

Тип параметра должен быть Vector_ref, а не Vector. Есть опечатка.

Vector_ref& operator=(const vector&);  

А здесь параметр должен быть vector<T>. Вы забыли упомянуть аргумент типа.

Но, читая комментарий, я считаю, что это также опечатка. Вы тоже не имели в виду vector<T>. Вы имеете в виду это:

// prevent copying  
Vector_ref(const Vector_ref&);  
Vector_ref& operator=(const Vector_ref&); 

В C ++ 0x вы можете сделать следующее, чтобы предотвратить копирование:

// prevent copying  
Vector_ref(const Vector_ref&) = delete;            //disable copy ctor
Vector_ref& operator=(const Vector_ref&) = delete; //disable copy assignment
...