• 0

[C++] Undefined Reference to...


Question

I seem to always get this error when I start a new assignment, and I never remember how I fixed it the last time. This time it's driving me bat s- crazy. I've been googling for a few hours now with no luck so I've decided it's time to post for help and go to bed.

Here's some snippets of the code first:

LinkedList.h:

#include "ListNode.h"
#include <string>
using std::string;

#ifndef LINKEDLIST_H_
#define LINKEDLIST_H_

template <class T>
class LinkedList
{
public:
	LinkedList();
	virtual ~LinkedList();

	T push(T);
	T get(int position);
	T remove(int position);

	ListNode<T>* getNode(int position);
	ListNode<T>* lastNode();

	string toString();
private:
	ListNode<T> *firstNode;
	int length;
};

#endif /*LINKEDLIST_H_*/

LinkedList.cpp: (the first few lines of it anyway -- all of the functions declared in the .h are implemented below the empty constructor/destructor)

#include "LinkedList.h"

template <class T>
LinkedList<T>::LinkedList()
{
	length = 0;
}
template <class T>
LinkedList<T>::~LinkedList()
{
}

Main.cpp:

#include <iostream>
#include "LinkedList.h"

int main(int argc, char *argv[]) {
	std::cout << "Entry Point Reached" << std::endl;
	LinkedList<int> linkedList;
	linkedList.push(124);
}

So that's the effective source, now here's what's being run to compile:

g++ -pedantic-errors -c ListNode.cpp
g++ -pedantic-errors -c LinkedList.cpp
g++ -pedantic-errors -c FileFacade.cpp
g++ -pedantic-errors -c RecordFacade.cpp
g++ -pedantic-errors -o cpps3a1.bin Main.cpp ListNode.o LinkedList.o FileFacade.o RecordFacade.o

Which gives me this error:

/tmp/ccnecGST.o: In function `main':
Main.cpp:(.text+0xaf): undefined reference to `LinkedList<int>::LinkedList()'
Main.cpp:(.text+0xc2): undefined reference to `LinkedList<int>::push(int)'
Main.cpp:(.text+0xcd): undefined reference to `LinkedList<int>::~LinkedList()'
Main.cpp:(.text+0xe8): undefined reference to `LinkedList<int>::~LinkedList()'
collect2: ld returned 1 exit status

I can't figure it out. I'm really hoping it's just something really simple that I've missed over and over again, but who knows.

Thanks very much for the help.

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0
So that's the effective source, now here's what's being run to compile:

g++ -pedantic-errors -c ListNode.cpp
g++ -pedantic-errors -c LinkedList.cpp
g++ -pedantic-errors -c FileFacade.cpp
g++ -pedantic-errors -c RecordFacade.cpp
g++ -pedantic-errors -o cpps3a1.bin Main.cpp ListNode.o LinkedList.o FileFacade.o RecordFacade.o

Which gives me this error:

/tmp/ccnecGST.o: In function `main':
Main.cpp:(.text+0xaf): undefined reference to `LinkedList<int>::LinkedList()'
Main.cpp:(.text+0xc2): undefined reference to `LinkedList<int>::push(int)'
Main.cpp:(.text+0xcd): undefined reference to `LinkedList<int>::~LinkedList()'
Main.cpp:(.text+0xe8): undefined reference to `LinkedList<int>::~LinkedList()'
collect2: ld returned 1 exit status

I don't know about GCC, not in the mood to test it(!), but VC++ compiler hates it when using templates the class/function implementation in another file.

Whenever I use template in a class I add the implementation in the header file as well.

Hope that helps.

Link to comment
Share on other sites

  • 0

You can, however, #include the CPP file. Remove the #include "LinkedList.h" part from LinkedList.cpp, and #include "LinkedList.cpp" in LinkedList.h. Here is an example using something simpler:

rpgfan.h

#ifndef __RPGFAN_H__
#define __RPGFAN_H__

template <typename T>
class RpgFan
{
  protected:
	T* data;

	//nobody should be creating an empty object without a way to set the data
	RpgFan (void);

  public:
	RpgFan (T);
	virtual ~RpgFan (void);

	T
	getData (void) const;
};

#include "rpgfan.cpp" /**** this is the important part ****/

#endif //__RPGFAN_H__

rpgfan.cpp

#ifndef __RPGFAN_CPP__
#define __RPGFAN_CPP__

/**** notice there is no #include "rpgfan.h" here ****/

template <typename T>
RpgFan<T>::RpgFan (void)
{
  data = 0;
}

template <typename T>
RpgFan<T>::RpgFan (T t)
{
  data = new T(t);
}

template <typename T>
RpgFan<T>::~RpgFan (void)
{
  delete data;
  data = 0;
}

template <typename T>
T
RpgFan<T>::getData (void) const
{
  return *data;
}

#endif //__RPGFAN_CPP__

I hope this helps!

Link to comment
Share on other sites

  • 0
Basically it's still makes one file using pre-processor command "include". I still suggest to put everything in one file.

Yeah, that is true. Then again, everything gets #included anyway, so why not just put everything into a single file? It is possible to do for some of the largest projects. It just gets really complicated, and loading a 23475-line source file tends to be a bit tedious for some of the best source code editors. That is why we have the freedom to #include files, right? ^_^

Link to comment
Share on other sites

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.