Рассмотрим следующий код:
template<typename T>
struct MyTempl
{
virtual void doStuff(const T &value) = 0;
};
struct MyImpl : MyTempl<int>
{
void doStuff(const int &value) {}
};
struct MyPtrImpl : MyTempl<int*>
{
void doStuff(const int* &value) {}
};
MyImpl imp1;
MyPtrImpl imp2;
Это не скомпилируется правильно: компилятор говорит мне, что doStuff() в MyPtrImpl является чисто виртуальным, т.е. Я не смог правильно его переопределить. Если я, однако, typedef int*, что-то вроде int_ptr, и использую его как аргумент шаблона для MyPtrImpl, все будет работать.
Почему компилятор не может вычесть мои намерения без typedef?