0

So I'm a bloody idiot and cannot for the life of me figure this out. This is after a few hours of looking for a possible answer to no avail. I'm required to have the overloaded << operator to pass to a print function within a class. My current implementation is an allegedly working example that gives me the following error:

List.cpp:261:55: error: default argument given for parameter 2 of ‘void cop4530::
List<T>::print(std::ostream&, char) const’ [-fpermissive] In file included from
test_list.cpp:3:0: List.h:103:10: error: after previous specification in ‘void
cop4530::List<T>::print(std::ostream&, char) const’ [-fpermissive]

I would greatly appreciate any help with this as it's my last ducking error.

Here is the Implementation File:

template <class T>
void List<T>::print(std::ostream& os, char ofc = ' ') const {

    for (List<T>::const_iterator it = begin(); it != end(); ++it)
    { 
         os << *it << ofc;
    }
}

template <class T>
std::ostream & operator<<(std::ostream &os, const List<T> &l) {
    l.print(os);
    return os;
}

Here is the header file:

#ifndef DL_LIST_H
#define DL_LIST_H
#include <iostream>

namespace cop4530 {

template <typename T>
class List {
 private:
    // nested Node class
    struct Node {
        T data;
        Node *prev;
        Node *next;

        Node(const T & d = T{}, Node *p = nullptr, Node *n = nullptr) 
            : data{d}, prev{p}, next{n} {}
        Node(T && d, Node *p = nullptr, Node *n = nullptr)
            : data{std::move(d)}, prev{p}, next{n} {}
    };

 public:
    //nested const_iterator class
    class const_iterator {
    public:
    const_iterator(); // default zero parameter constructor
    const T & operator*() const; // operator*() to return element

    // increment/decrement operators
    const_iterator & operator++();
    const_iterator operator++(int);
    const_iterator & operator--();
    const_iterator operator--(int);

    // comparison operators
    bool operator==(const const_iterator &rhs) const;
    bool operator!=(const const_iterator &rhs) const;

    protected:
    Node *current; // pointer to node in List
    T & retrieve() const; // retrieve the element refers to
    const_iterator(Node *p); // protected constructor

    friend class List<T>;
    };

    // nested iterator class
    class iterator : public const_iterator {
    public:
    iterator() {}
    T & operator*();
    const T & operator*() const;

    // increment/decrement operators
    iterator & operator++();
    iterator operator++(int);
    iterator & operator--();
    iterator operator--(int);

    protected:
    iterator(Node *p);
    friend class List<T>;
    };

 public:
    // constructor, desctructor, copy constructor
    List(); // default zero parameter constructor
    List(const List &rhs); // copy constructor
    List(List && rhs); // move constructor
    // num elements with value of val
    explicit List(int num, const T& val = T{}); 
    // constructs with elements [start, end)
    List(const_iterator start, const_iterator end); 

    ~List(); // destructor

    // copy assignment operator
    const List& operator=(const List &rhs);
    // move assignment operator
    List & operator=(List && rhs);

    // member functions
    int size() const; // number of elements
    bool empty() const; // check if list is empty
    void clear(); // delete all elements
    void reverse(); // reverse the order of the elements

    T &front(); // reference to the first element
    const T& front() const;
    T &back(); // reference to the last element
    const T & back() const; 

    void push_front(const T & val); // insert to the beginning
    void push_front(T && val); // move version of insert
    void push_back(const T & val); // insert to the end
    void push_back(T && val); // move version of insert
    void pop_front(); // delete first element
    void pop_back(); // delete last element

    void remove(const T &val); // remove all elements with value = val

    // print out all elements. ofc is deliminitor
    void print(std::ostream& os, char ofc = ' ') const; 

    iterator begin(); // iterator to first element
    const_iterator begin() const;
    iterator end(); // end marker iterator
    const_iterator end() const; 
    iterator insert(iterator itr, const T& val); // insert val ahead of itr
    iterator insert(iterator itr, T && val); // move version of insert
    iterator erase(iterator itr); // erase one element
    iterator erase(iterator start, iterator end); // erase [start, end)


private:
    int theSize; // number of elements
    Node *head; // head node
    Node *tail; // tail node

    void init(); // initialization
};

// overloading comparison operators
template <typename T>
bool operator==(const List<T> & lhs, const List<T> &rhs);

template <typename T>
bool operator!=(const List<T> & lhs, const List<T> &rhs);

// overloading output operator
template <typename T>
std::ostream & operator<<(std::ostream &os, const List<T> &l);

// include the implementation file here
#include "List.cpp"

} // end of namespace 4530

#endif
  • 3
    Don't repeat the default argument specification in implementations, only in declarations. – user3286380 Feb 13 '14 at 03:06
  • `List.cpp:261:55: error` look suspicious, read [why-can-templates-only-be-implemented-in-the-header-file](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – Jarod42 Feb 13 '14 at 12:09
  • ¡Dios mio! I could slap myself for such a rookie mistake. Thanks everyone! – Wolf Vomit Feb 13 '14 at 18:22

0 Answers0