• 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

    • Oh wow, a patch for an Unreal game to improve performance? We'll see...
    • Get this massive 4TB WD_BLACK SN7100 SSD at a new all-time low price by Taras Buria Xbox owners recently received a new storage upgrade option, which allows them to equip the Xbox Series X|S with 4TB of extra space. That card, however, has an eye-watering price tag—nearly as much as the 1TB Xbox Series S. On the PC side, though, things are much better. Right now, if you need a 4TB SSD without selling a kidney, you can get the WD_BLACK SN7100 PCIe Gen4 SSD. It is now available on Amazon at a new all-time low price after a 16% discount (nearly half the cost of the new 4TB Xbox Storage Expansion Card). The SN7100 is a fast, reliable, and, more importantly, affordable Gen4 solid-state drive. Its speeds are rated up to 7,000MB/s sequential read and 6,700MB/s sequential write, while random input-output speeds are rated at 900K IOPS read and 1,350K IOPS write. These specs are not record-breaking, but they are fast enough for modern gaming (DirectStorage is supported), fast loading times in games and apps, and quick file transfer. The WD_BLACK SN7100 has a limited five-year warranty and endurance rating up to 2,400 TBW. You can monitor the health of your drive in the WD_Black Dashboard app on Windows. As for compatibility, you can use the SN7100 in any PC that accommodates M.2 2280 PCIe Gen4 drives, including PlayStation 5. It is compatible with PCIe Gen3 systems, but the maximum speeds will be limited. 4TB WD_BLACK SN7100 PCIe Gen4 Solid-State Drive - $249.99 | 16% off on Amazon US This Amazon deal is US-specific and not available in other regions unless specified. If you don't like it or want to look at more options, check out the Amazon US deals page here. Get Prime (SNAP), Prime Video, Audible Plus or Kindle / Music Unlimited. Free for 30 days. As an Amazon Associate, we earn from qualifying purchases.
    • Snagit 2025.2.0 by Razvan Serea Snagit is the most complete screen capture utility available. Showing someone exactly what you see on your screen is sometimes the quickest and clearest way to communicate. With Snagit, you can select anything on your screen – an area, image, article, Web page, or error message – and capture it. Then, save the screen capture to a file, send it to Snagit​'s editor to add professional effects, share it by e-mail, or drop it into PowerPoint®, Word®, or another favorite application. Capture and share images, text or video from your PC. Create beautiful presentations, flawless documentation and quickly save online content. The latest version of Snagit offers a totally new interface and workflow - making SnagIt easier for beginners to use, while still providing maximum convenience and flexibility for the screen capture experts. Snagit 2025.2.0 changelog: Edit Images from Camtasia Snagit can now be used to seamlessly edit images from Camtasia. Requires Camtasia version 2025.2.0 or later. In the Camtasia Media Bin, right-click an image and select the Edit in Snagit option. In Snagit, make your edits. When finished, click Send in the "Send changes to Camtasia" notification to replace the image on your Camtasia timeline. Step Capture Improved the Step Capture template to accommodate longer auto-populated step text. Annotations such as Callout or Arrow tool objects now anchor to and move with sections as sections are added to, reordered, or deleted from templates. Subscription Software Updated the Account dropdown to open automatically when new subscription related messages are present. Performance Improvements Improved the startup time for Snagit Capture application. Updates for IT Administrators Updated BouncyCastle.Cryptography package to address CVE-2024-29857 and CVE-2024-30172. Removed dependency on Xceed Zip. Updated LeadTools DLLs. Fixed an issue where Snagit might not recognize offline subscription activation. Fixed an issue where the video recording toolbar could be hidden from users when using Snagit in virtual environments or with remote desktop applications. Bug Fixes Fixed an issue where using Step Capture with the Share destination set to File in the Capture Window could result in data loss. Fixed a crash that could occur when capturing on some HDR monitors. Fixed an issue where the cursor object in a capture might include some of the background image in certain situations. Fixed an issue with the Box share destination to use the default browser for authentication. Fixed an issue where the Blur tool Color property could show when the blur or pixelate Type was selected. Fixed an issue where the privacy policy link in Snagit's installer might not open in the expected language. (PONRPD) Download: Snagit 64-bit | 419.0 MB (Shareware) Links: SnagIt Home Page | Release Notes Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Markdown's creator weighs in on rumored Apple Notes export feature by David Uzondu The rumor mill is churning as we draw closer to WWDC2025, and one of the interesting developments being discussed is a report from 9To5Mac that claimed Apple Notes in iOS 19 iOS 26, will finally get Markdown export capabilities. This caught the attention of many, including the person who actually invented Markdown. John Gruber, the creator of Markdown, shared his thoughts on this potential new feature on his weblog. For those who don't know, Markdown, which Gruber developed back in 2004 with significant input from Aaron Swartz (RIP!), is a lightweight markup language designed for creating formatted text using a plain text editor. Its main advantage is that it is easy to read and easy to write. When the news first broke, some interpretations suggested Apple Notes would gain full Markdown support, transforming it into an application where users could directly type and see Markdown syntax, much like how specialized editors like Obsidian operate. These tools are intended for users to work directly within the Markdown framework for all their note-taking. Gruber himself indicated that he does not believe Apple Notes should become a full-fledged "Markdown editor," even as an option. He stated that such a change would be a "huge mistake." His reasoning is rooted in his original vision for Markdown and his view of Apple Notes' purpose. He reiterated that he initially designed Markdown as a "text-to-HTML conversion tool for web writers" and for contexts requiring plain text file storage. He feels Apple Notes serves a different, valuable role with its current WYSIWYG (What You See Is What You Get) rich text editing. This interface, he argues, is excellent for quickly capturing thoughts, particularly on an iPhone, and aligns with the Macintosh philosophy of user-friendliness. He pointed out that creating a syntactically incorrect markdown is trivial, whereas a malformed note should not be possible with Apple Notes. Despite his reservations about a complete Markdown overhaul for the editing experience, Gruber finds the prospect of exporting notes in Markdown format very appealing. He wrote that this specific capability "sounds awesome." He pointed out, quite rightly, that Apple Notes' current export functions are rather limited, primarily offering PDF and Pages document formats. Adding Markdown export would provide a much more flexible way for users, especially those in the "niche" he identifies with, to move their content out of Notes and into other applications. Gruber did express curiosity about how Apple might handle images embedded in notes during a Markdown export, as image handling can be a tricky aspect of Markdown.
    • What? Every single app I've installed from the Microsoft Store comes from its intended developer and works perfectly fine. What apps do you install?
  • Recent Achievements

    • Week One Done
      jfam earned a badge
      Week One Done
    • First Post
      survivor303 earned a badge
      First Post
    • Week One Done
      CHUNWEI earned a badge
      Week One Done
    • One Year In
      survivor303 earned a badge
      One Year In
    • Week One Done
      jbatch earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      419
    2. 2
      +FloatingFatMan
      183
    3. 3
      snowy owl
      181
    4. 4
      ATLien_0
      177
    5. 5
      Xenon
      140
  • Tell a friend

    Love Neowin? Tell a friend!