ожидаемый конструктор, деструктор или преобразование типов перед & token - PullRequest
1 голос
/ 12 апреля 2011

Я получаю загадочную ошибку в моем проекте, которая говорит:

ожидаемый конструктор, деструктор или преобразование типов

Это не позволяет мне использовать мой перегруженныйoperator<<.Ранее это работало до того, как я превратил свой класс (myVector) в template

//MyVector class
//An implementation of a vector of integers.
template <class T>
class MyVector{
public:
    //Purpose: Initialize an object of type MyVector
    //Parameters: none.
    //Returns: nothing.
    MyVector();

    //------------------------------------------------
    //Purpose: Initialize an object of type MyVector
    //Parameters: an integer.
    //Returns: nothing.
    //------------------------------------------------
    MyVector(int);

    //Purpose: Destroys objects of type MyVector
    //Parameters: none.
    //Returns: nothing
    //------------------------------------------------
    ~MyVector();

    //Purpose: Returns the current size of the MyVector.
    //Parameters: none.
    //Returns: the size.
    int size() const;

    //------------------------------------------------
    //Purpose: Returns the capacity of the MyVector.
    //Parameters: none.
    //Returns: int.
    int capacity() const;

    //------------------------------------------------
    //Purpose: Removes the entries of MyVector.
    //Parameters: none.
    //Returns: nothing.
    void clear();

    //------------------------------------------------
    //Purpose: Appends a given integer to the vector.
    //Parameters: an integer.
    //Returns: nothing.
    void push_back(T);

    //------------------------------------------------
    //Purpose: Shows what's at a given position.
    //Parameters: an integer index.
    //Returns: an integer.
    T at(int) const;

    MyVector(const MyVector& b);
    const MyVector& operator=(const MyVector&);

    //------------------------------------------------

private:
    int _size;
    int _capacity;
    int* head;

    //Purpose: Increases the capacity of a MyVector when it's 
    // capacity is equal to it's size. Called by push_back(int)
    //Parameters/Returns: nothing.
    void increase();

    //Purpose: Copies the given vector reference. 
    //Param: MyVector reference.
    //Returns: nothing.
    void copy(const MyVector&);

    //Purpose: Frees MyVector up for an assignment.
    void free();
};

template <class T>
ostream& operator<<(ostream&, const MyVector<T>);
//This line is giving me the error.

#endif

У меня есть код оператора в отдельном файле:

template <class T>
ostream& operator<<(ostream& os, const MyVector<T> V){
    int N = V.size();
    os << endl;
    for(int i = 0; i<N; i++){
        os << V.at(i)<<endl;
    }
    return os;
}

I 'Мы смотрели на другие вопросы, но, похоже, ни один из них не соответствует моим.Помощь будет принята с благодарностью.Спасибо!

Ответы [ 5 ]

2 голосов
/ 12 апреля 2011

Вам, вероятно, нужно квалифицировать ostream с std как:

std::ostream& operator<<(std::ostream&, const MyVector<T>);

И вы почти наверняка должны передавать свой вектор по константной ссылке, а не по константному значению.

0 голосов
/ 04 декабря 2016

Нет необходимости Объявить это:

template <class T>
ostream& operator<<(ostream&, const MyVector<T>);

Вы можете следить за этим

#include <iostream>
using namespace std;
template <class T>
class A
{
public:
A();
int _size;
};
template <class T>
ostream& operator<<(ostream&, const A<T> p)
{
cout<<"in ostream"<<endl;
}
template <class T>
A<T>::A()
{
_size = 90;
cout<<_size<<endl;
}
int main()
{
A<int> ob;
cout<<ob;
return 0;
}
0 голосов
/ 23 января 2013

Ожидаемый конструктор, деструктор или преобразование типа предполагает, что он не распознает ostream как тип (т. Е. Он не был объявлен в этой области). Префикс с std :: не достаточно для решения проблемы; Вы также должны включить зависимый файл.

#include <ostream> 
0 голосов
/ 12 апреля 2011

Вы должны заставить функцию << принимать постоянную ссылку на <code>MyVector, а не просто константу, поскольку вы создаете копию вектора для передачи в функцию.

template <class T> std::ostream& operator<<(ostream& o, const MyVector<T>& V)
0 голосов
/ 12 апреля 2011

Вы не можете объявить шаблон в файле, а затем определить его в другом файле. Вы можете только определить это.

Надеюсь, это помогло вам.

...