I have a queue class that has this definition:
template <typename T>
class SharedQueue
{
public:
SharedQueue();
~SharedQueue();
};
In test.h, I have as one of the variables in the class:
SharedQueue<int>* sharedQueue;
In test.cpp, I am trying to do:
sharedQueue = new SharedQueue<int>;
But, for some reason, it's giving me errors. Am I not initializing the template class properly?
I looked and noticed this: Why can templates only be implemented in the header file? but it's difficult to see how relevant that is to me
UPDATE: The error is
Error LNK2001 unresolved external symbol "public: __cdecl SharedQueue<int>::SharedQueue<int>(void)" (??0?$SharedQueue@H@@QEAA@XZ) Demo C:\test\foo.obj 1
1 unresolved externals
UPDATE TWO:
SharedQueue.h:
#pragma once
#include <queue>
#include <mutex>
#include <condition_variable>
template <typename T>
class SharedQueue
{
public:
SharedQueue();
~SharedQueue();
T& front();
void pop_front();
void push_back(const T& item);
void push_back(T&& item);
int size();
bool empty();
private:
std::deque<T> queue_;
std::mutex mutex_;
std::condition_variable cond_;
};
SharedQueue.cpp:
#include "SharedQueue.h"
template <typename T>
SharedQueue<T>::SharedQueue()
{
}
template <typename T>
SharedQueue<T>::~SharedQueue()
{
}
template <typename T>
T& SharedQueue<T>::front()
{
std::unique_lock <std::mutex> mlock(mutex_);
while (queue_.empty())
{
cond_.wait(mlock);
}
return queue_.front();
}
template <typename T>
void SharedQueue<T>::pop_front()
{
std::unique_lock<std::mutex> mlock(mutex_);
while (queue_.empty())
{
cond_.wait(mlock);
}
queue_.pop_front();
}
template <typename T>
void SharedQueue<T>::push_back(const T& item)
{
std::unique_lock<std::mutex> mlock(mutex_);
queue_.push_back(item);
mlock.unlock();
cond_.notify_one();
}
template <typename T>
void SharedQueue<T>::push_back(T&& item)
{
std::unique_lock<std::mutex> mlock(mutex_);
queue_.push_back(std::move(item));
mlock.unlock();
cond_.notify_one();
}
template <typename T>
int SharedQueue<T>::size()
{
std::unique_lock<std::mutex> mlock(mutex_);
int size = queue_.size();
mlock.unlock();
return size;
}