Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7414801
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 29, 20262026-05-29T07:10:22+00:00 2026-05-29T07:10:22+00:00

I am attempting to compile a new class template within the namespace cop4530. Do

  • 0

I am attempting to compile a new class template within the namespace cop4530. Do you have any idea why I am getting this back? These functions do exist and the compiler isn’t helping me by saying much about the specifics. I have done what this thread says already, but I still get undefined symbols

g++ -o proj2.x  test_list.o
Undefined symbols for architecture x86_64:
  "cop4530::List<int>::iterator::operator++(int)", referenced from:
      _main in test_list.o
  "cop4530::List<int>::iterator::operator*()", referenced from:
      _main in test_list.o
  "cop4530::List<int>::iterator::operator++()", referenced from:
      _main in test_list.o
      cop4530::List<int>::List(int, int const&)in test_list.o
  "cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::iterator::operator++(int)", referenced from:
      _main in test_list.o
  "cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::iterator::operator*()", referenced from:
      _main in test_list.o
  "cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::iterator::operator++()", referenced from:
      _main in test_list.o
      cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::List(int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in test_list.o
  "cop4530::List<int>::iterator::iterator(cop4530::List<int>::Node*)", referenced from:
      cop4530::List<int>::erase(cop4530::List<int>::iterator)in test_list.o
      cop4530::List<int>::clear()  in test_list.o
      cop4530::List<int>::insert(cop4530::List<int>::iterator, int const&)in test_list.o
  "cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::iterator::iterator(cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::Node*)", referenced from:
      cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::erase(cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::iterator)in test_list.o
      cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::clear()in test_list.o
      cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::insert(cop4530::List<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::iterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in test_list.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [List_executable] Error 1

My header was written by textbook and nothing has been changed(or can be changed for this project), so the problem isn’t there. Same with the driver ‘test_list’. At the end of the header file there is an include (what the question [its not called a thread, I’m told] above said to do.)

Header anyway:

#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 = NULL, Node *n = NULL) 
        : data(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
    // 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

    // assignment operator
    const List& operator=(const 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_back(const T & val); // insert to the end
    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 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

Here is the .cpp file. Its not completely finished:

using namespace std;

// --------------------- CONST_ITERATOR --------------------- //
template <class T>
List<T>::const_iterator::const_iterator()
{ // default zero-parameter constructor. Set pointer current to NULL.
  current = NULL;
}

template <class T>
const T& List<T>::const_iterator::operator*() const
{ // returns a reference to the corresponding element in the list by calling retrieve() member function.
  return retrieve();
}

template <class T>
typename List<T>::const_iterator& List<T>::const_iterator::operator++()
{
  current = current->next;
  return *this;
}
template <class T>
typename List<T>::const_iterator List<T>::const_iterator::operator++(int)
{
  const_iterator old = *this;
  ++( *this );
  return old;
}
template <class T>
typename List<T>::const_iterator& List<T>::const_iterator::operator--()
{
  current = current->prev;
  return *this;
}
template <class T>
typename List<T>::const_iterator List<T>::const_iterator::operator--(int)
{
  const_iterator old = *this;
  --( *this );
  return old;
}

template <class T>
bool List<T>::const_iterator::operator==(const const_iterator &rhs) const
  {return current == rhs.current;}

template <class T>
bool List<T>::const_iterator::operator!=(const const_iterator &rhs) const
  {return !( *this == rhs );}

template <class T>
T& List<T>::const_iterator::retrieve() const
{ // return a reference to the corresponding element in the list.
  return current->data;
}

template <class T>
List<T>::const_iterator::const_iterator(Node *p)
{ // one-parameter constructor
  // Set pointer current to the given node pointer p.
  current = p;
}

// --------------------- ITERATOR --------------------- //

template <class T>
T& List<T>::iterator::operator*()
{
  return retreive();
}

template <class T>
const T& List<T>::iterator::operator*() const
{
  return retreive();
}

template <class T>
List<T>::iterator & List<T>::iterator::operator++()
{
  current = current->next;
  return *this;
}

template <class T>
List<T>::iterator List<T>::iterator::operator++(int)
{
  const_iterator old = *this;
  ++( *this );
  return old;
}

template <class T>
List<T>::iterator & List<T>::iterator::operator--()
{
  current = current->prev;
  return *this;
}

template <class T>
List<T>::iterator List<T>::iterator::operator--(int)
{
  const_iterator old = *this;
  --( *this );
  return old;
}

template <class T>
List<T>::iterator::iterator(Node *p)
{ // one-parameter constructor
  // Set current to the given node pointer p
  current = p;
}

// --------------------- LIST --------------------- //

template <class T>
List<T>::List()
{ init(); }

template <class T>
List<T>::List( const List & rhs )
{ // Copy constructor
  init();
  *this = rhs;
}

template <class T>
List<T>::List(int num, const T& val)
{ //Constructs a list with num elements, all initialized with value val
  init();
  iterator itr = begin();
  for (int i = 0; i < num; ++i)
  {
    insert(itr, val);
    ++itr;
  }
}

template <class T>
List<T>::List(const_iterator start, const_iterator end)
{ // Constructs a List w/ elements from another List between
  // start and end. [includes start, not end) 
  ///////////
}

template <class T>
List<T>::~List()
{ // Destructor
  clear();
  delete head;
  delete tail;
}

template <class T>
const typename List<T>::List& List<T>::operator=(const List &rhs)
{ // Assignment operator
  List<T>::iterator ritr = rhs.first();
  List<T>::iterator itr = begin();

  if( this != &rhs )
    {
      clear();
      for( ; !ritr.isPastEnd( ); ritr.advance( ), itr.advance( ) )
    insert( ritr.retrieve( ), itr );
    }
  return *this;
}

template <class T>
int List<T>::size() const
{ // return the number of elements in the List
  return theSize;
}

template <class T>
bool List<T>::empty() const
{ // check if list is empty
  return head->next == NULL;
}

template <class T>
void List<T>::clear()
{ // delete all elements
  while( !isEmpty( ) )
    erase( begin().retreive() );
}

template <class T>
void List<T>::reverse()
{ // reverse the order of the elements
  /////////////
}

template <class T>
T& List<T>::front()
{ // reference to the first element
  return head->next->data;
}

template <class T>
T& List<T>::back()
{ // reference to the last element
  return tail->prev->data;
}

template <class T>
void List<T>::push_front(const T & val)
{ // insert to the beginning

}

template <class T>
void List<T>::push_back(const T & val)
{ // insert to the end

}

template <class T>
void List<T>::pop_front()
{ // delete first element

}

template <class T>
void List<T>::pop_back()
{ // delete last element

}

template <class T>
void List<T>::remove(const T &val)
{ // remove all elements with value = val

}

template <class T>
void List<T>::print(std::ostream& os, char ofc) const
{ // print out all elements. ofc is deliminitor

}

template <class T>
typename List<T>::iterator List<T>::begin()
{ // iterator to first element
  return List<T>::iterator( head->next );
}

template <class T>
typename List<T>::iterator List<T>::end()
{ // end marker iterator
  return List<T>::iterator( tail->prev );
}

template <class T>
typename List<T>::iterator List<T>::insert( iterator itr, const T & x )
{
  Node *p = itr.current;
  theSize++;
  return iterator( p->prev = p->prev->next = new Node( x, p->prev, p) );
}

template <class T>
typename List<T>::iterator List<T>::erase( iterator itr )
{
  Node *p = itr.current;
  iterator retVal( p->next );
  p->prev->next = p->next;
  p->next->prev = p->prev;
  delete p;
  theSize--;

  return retVal;
}

template <class T>
typename List<T>::iterator List<T>::erase( iterator start, iterator end )
{
  for( iterator itr = start; itr != end; )
    itr = erase( itr );

  return end;
}

template <class T>
void List<T>::init()
{ // Initaialize the member variables of a List
  theSize = 0;
  head = new Node;
  tail = new Node;
  head->next = tail;
  tail->prev = head;
}


// --------- OVERLOADS --------- //

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)
{

}

template <typename T>
std::ostream & operator<<(std::ostream &os, const List<T> &l)
{

}

Let me just add that I appreciate any and all help given. I am a student and I am trying to learn.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-29T07:10:23+00:00Added an answer on May 29, 2026 at 7:10 am

    Template class methods are instanced the first time they are used, so a definition for List<int> and List<string> must be visible from the calling unit.

    Your textbook seems to assume compiler support for external template definitions, that GCC don’t support.

    An easy fix is to copy-paste the List.cpp file content inside the compilation unit you are trying to fix.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I am attempting to compile a c++ class using gcc. Due to the nature
I have the following Ria Service define: namespace SilverlightTest.Web { [EnableClientAccess()] public class ContactService
I am attempting to compile and run a C program in Xcode. This program
I have just set up a new Eclipse Java project. In this project I
When attempting to compile my C# project, I get the following error: 'C:\Documents and
All this originated from me poking at a compiler warning message (C4267) when attempting
Attempting to use the data series from this example no longer passes the JSONLint
Is it possible to have multiple specializations of a variadic template where one of
I'm attempting to compile code in a text file to change a value in
Currently attempting to get some code to compile using Lejos for the Lego NXT

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.