Blocking queue implementation using c++

Blocking queue will be very important if are processing a job/command from a queue asynchronously.
Recently I had written a thread pool where I had to use a blocking que.Motivated from C# BlockingCollection and Java’s different different blocking collection(LinkedBlockingQueue, ArrayBlockingQueue, PriorityBlockingQueue, SynchronousQueue)


I have written a blocking queue.Here I am sharing it, you can extend it based on your need.
I have used c++ 11 threading mechanism to implement it.

#pragma once
#include <iostream>
#include<queue>
#include <mutex>
template <class T>
class BlockingQueue
{
public:
	BlockingQueue() { ; }

	void push(const T & data)
	{
		std::unique_lock<std::mutex> lock(m_mtxData);
		m_Data.push(data);
		m_Cv.notify_one();
	}

	void pop()
	{
		std::unique_lock<std::mutex> lock(m_mtxData);
		if(!m_Data.empty())
			m_Data.pop();
	}

	T& front()
	{
		std::unique_lock<std::mutex> lock(m_mtxData);
		m_Cv.wait(lock, [&] { return  !m_Data.empty(); });
		T& data = m_Data.front();
		return data;
	}

	T& back()
	{
		std::unique_lock<std::mutex> lock(m_mtxData);
		m_Cv.wait(lock, [&] { return  !m_Data.empty(); });
		T& data = m_Data.back();
		return data;
	}


	bool empty()
	{
		return m_Data.empty();
	}

	size_t size()
	{
		return m_Data.size();
	}

private:
	std::queue <T> m_Data;
	std::condition_variable m_Cv;
	std::mutex m_mtxData;
};