#include <iostream>

template<typename T>
class ptr {
	T* m_ptr;
    public:
		ptr(T* a_ptr) : m_ptr(a_ptr) {}
        T& operator * () const { return *m_ptr; };
};

template<>
class ptr<void> {
	void* m_ptr;
    public:
		ptr(void* a_ptr) : m_ptr(a_ptr) {}
};

int main()
{
	int i = 12345;
	ptr<int> ptr_i(&i);
	std::cout << *ptr_i; // OK

	ptr<void> ptr_i2(&i);
	std::cout << *ptr_i2; // ERROR
	
	return 0;
}