Sign in to follow this  
CAREFiSH

Linker errors when using templates.

Recommended Posts

CAREFiSH    103
Hey there folks,

I've been sent here by a friend, he told me to post my problem here. Been trying to solve this for the past three days now. And I was following a books exercise, with the exception that I have seperate headers and cpp files, and this is my first attempt at using templates.
I've been having these linker errors, and they make no sense to me. I've double checked, not just once, not twice but thrice times!
What I've done is: check for the proper includes, check if I've implemented all the methods properly. And removed and added the file causing the errors in my project.
I've tried changing the code generation Multi-Threaded Debug DLL to Multi-Threaded Debug. And other types as well. I've tried going from Debug to Release.

The errors:


1>Stroustrupbookexercises.obj : error LNK2001: unresolved external symbol "public: __thiscall LinkedList<class Data>::LinkedList<class Data>(void)" (??0?$LinkedList@VData@@@@QAE@XZ)
1>Stroustrupbookexercises.obj : error LNK2001: unresolved external symbol "public: __thiscall LinkedList<class Data>::~LinkedList<class Data>(void)" (??1?$LinkedList@VData@@@@QAE@XZ)
1>Stroustrupbookexercises.obj : error LNK2001: unresolved external symbol "public: void __thiscall LinkedList<class Data>::insert(class Data *)" (?insert@?$LinkedList@VData@@@@QAEXPAVData@@@Z)
1>Stroustrupbookexercises.obj : error LNK2001: unresolved external symbol "public: void __thiscall LinkedList<class Data>::showAll(void)" (?showAll@?$LinkedList@VData@@@@QAEXXZ)
1>C:\Dropbox\C++ eBooks & Study Projects\Progress\Tim\Stroustrupbookexercises\Release\Stroustrupbookexercises.exe : fatal error LNK1120: 4 unresolved externals

[CODE]
//stdafx.h

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#include <stdio.h>
// TODO: reference additional headers your program requires here
#include "LinkedList.h"
#include "Data.h"
#include "Node.h"
#include "InternalNode.h"
#include "TailNode.h"
#include "HeadNode.h"

#include <iostream>
enum { Smaller, Equal, Larger };
//Header
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include "stdafx.h"
#include "HeadNode.h"
template <class T>
class LinkedList {
public:
LinkedList();
~LinkedList();
void insert(T* data);
void showAll();
private:
HeadNode<T> * head;
};
#endif
//Class
#include "stdafx.h"
template <class T>
LinkedList<T>::LinkedList(){
head = new HeadNode<T>;
}template <class T>
LinkedList<T>::~LinkedList(){
delete head;
}
template <class T>
void LinkedList<T>::insert(T* data){
head->insert(data);
}template <class T>
void LinkedList<T>::showAll() {
head->show();
}
[/CODE] Edited by CAREFiSH

Share this post


Link to post
Share on other sites
mrjones    612
Templates are sort-of header only. Meaning that compiler can't resolve template in linking phase and all method definitions must be available during compilation. This means that you should either put everything in your source file to header file and remove the source file or do some hack like this:
[code]
// LinkedList.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
... class declaration etc ...

// Do something that's generally a really bad idea
#include "LinkedList.cpp"

#endif
[/code]

[code]
// LinkedList.cpp
// Add ifdef, such that contents of this file are only compiled, if it is included from LinkedList.h
#ifdef LINKEDLIST_H

... Methods and everything else typically in a .cpp file...

#endif
[/code] Edited by mrjones

Share this post


Link to post
Share on other sites
CAREFiSH    103
Awesome!

I've used your first suggestion, put everything in their respective headerfiles. That seemed to work. Thanks alot for your explanation as well. (It's solved now).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this