Товарищи, тоброго времени суток!
Сегодня довольно много времени потратил, и так и не понял, как это можно сделать.
Хочу разобраться, как писать раздельно (интерфейс и реализацию) шаблонных классов в c++.
К примеру, на основе std queue и mutex хочу сделать блокирующую очередь, но я не знаю, какими объектами мне придётся пользоваться в разработке.
Я объявляю интерфейс:
#ifndef QUEUE_BLOCK_T_HPP
#define QUEUE_BLOCK_T_HPP
#include <queue>
#include <mutex>
template <class T>
class block_queue{
public:
block_queue(int = 100); // default size
~block_queue();
void push(const T&);
private:
std::mutex lock;
std::queue<T> q;
int max_size;
};
#endif
И реализацию:
#include "queue_block_t.hpp"
template <class T>
block_queue<T>::block_queue(int max_size_) : max_size(max_size_){}
template <class T>
block_queue<T>::~block_queue(){}
template <class T>
void block_queue<T>::push(const T& elem){
lock.lock();
q.push(elem);
lock.unlock();
}
Использую, к примеру, так:
#include "queue_block_t.hpp"
int main(int argc, char **argv) {
block_queue<int> q(500);
q.push(10);
return 0;
}
В итоге получаю:
main.cpp:7: undefined reference to `block_queue<int>::block_queue(int)'
main.cpp:8: undefined reference to `block_queue<int>::push(int const&)'
main.cpp:7: undefined reference to `block_queue<int>::~block_queue()'
main.cpp:7: undefined reference to `block_queue<int>::~block_queue()'
Почему эти функции необъявлены?
Так работает:
#ifndef QUEUE_BLOCK_T_HPP
#define QUEUE_BLOCK_T_HPP
#include <iostream>
#include <queue>
#include <mutex>
template <class T>
class block_queue{
public:
block_queue(int max_size__ = 100) : max_size(max_size__) { }
~block_queue(){ }
void push(const T& elem){
lock.lock();
q.push(elem);
lock.unlock();
}
private:
std::mutex lock;
std::queue<T> q;
int max_size;
};
#endif
Всем спасибо!