• 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
https://www.neowin.net/forum/topic/633585-c-undefined-reference-to/
Share on other sites

6 answers to this question

Recommended Posts

  • 0
  smiddy said:
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.

  • 0

Yeah, you can not separate template class into several files. Template class is not ordinary class, it's just a template for compiler which makes special functions later and if you separate into several files it does not know that. More information in C++ FAQ:

http://www.parashift.com/c++-faq-lite/temp....html#faq-35.12

  • 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!

  • 0
  david13lt said:
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? ^_^

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

    • No registered users viewing this page.
  • Posts

    • From cars to cosmos: Honda's experimental rocket aces first landing test by Paul Hill Image via Honda Watch your back SpaceX, the Japanese company Honda has just performed a successful first launch of its experimental reusable rocket. The 6.3 meter rocket, which weighs 900kg, reached a modest altitude of 271.4 meters, but managed to land within 37cm of its target (1.2 feet), which is certainly pretty close. The rocket took off from a Honda facility in Taiki Town, Hokkaido, a growing space town in Japan. The flight time was also modest, coming in at just 56.6 seconds, but in that time, Honda was able to demonstrate key reusability technologies such as flight stability and landing capability. This marks a significant milestone for Honda’s space R&D department, which began work just four years ago. If you remember the tests SpaceX was performing around 2012 with Grasshopper, well Honda is at about the same stage with its reusable rocket. Why Honda is building rockets: Beyond cars and motorcycles Honda said that it wants to leverage core technologies it already works on for offering space services. It said that reusable rockets are a key part of sustainable space transportation. By 2029, the company wants to be able to perform suborbital launches, and while commercialization hasn’t been decided yet, it sees itself launching remote-sensing and wide-area communication satellites in the future. The Japanese car maker sees growing demand for satellite launches and wants to be involved by developing reusable rockets which could help it perform such launches economically. If it does end up finding customers, it will add more competition to the rocket launch sector. While the company hasn’t confirmed this, by developing its own launch system, it could eventually be in a position to launch its own satellites that could provide services to its cars to add value for customers. The competitive landscape and Japan's space ambitions Honda is just the latest company to join the growing list of companies trying to develop reusable rocket technology. The most famous companies doing this are SpaceX and Blue Origin, but there are also lots of other companies around the world also developing this technology. Honda is still taking baby steps compared to SpaceX, but it shows that the company is taking a focused, step-by-step approach, and achieving successes as noted by this launch. Hopefully, the company ends up providing tough competition against SpaceX, Blue Origin, and other companies so that it can help to drive down prices and spur on innovation.
    • Does that subscription include international data roaming, inclusive of Russia?
    • If you're stupid enough to try and get one, each and every headache along the way is on you. I can only hope that these roadblocks on a pre-order are enough to dissuade people.
    • "You should have a Microsoft Account because we can help keep your data safe...until we can't." As an IT guy I know that I should never put my trust in one backup solution if the data is important. But for non-IT people, they are getting tricked into Microsoft's practices with falsehoods.
    • it is delayed and has no definitive release date... that is "delayed indefinitely".
  • Recent Achievements

    • Week One Done
      TBithoney earned a badge
      Week One Done
    • First Post
      xuxlix earned a badge
      First Post
    • First Post
      Tomek Święcicki earned a badge
      First Post
    • One Year In
      carlitin86 earned a badge
      One Year In
    • Reacting Well
      Peterlll06 earned a badge
      Reacting Well
  • Popular Contributors

    1. 1
      +primortal
      684
    2. 2
      ATLien_0
      289
    3. 3
      Michael Scrip
      228
    4. 4
      +FloatingFatMan
      192
    5. 5
      Steven P.
      145
  • Tell a friend

    Love Neowin? Tell a friend!