В предыдущем сообщении говорится, что вам НЕ НУЖНО специализироваться на типах указателей, но вы можете.
Примите во внимание следующее:
struct Bar {
void bar(void) { /* do work */ }
};
template <class T> struct Foo {
T t;
void foo(void)
{
t.bar(); // If T is a pointer, we should have used operator -> right?
}
};
int main(int argc, char * argv[])
{
Foo<Bar *> t;
t.foo();
}
Это не скомпилируется.Потому что в Foo :: foo у нас есть указатель, но мы используем его как переменную.
Если вы добавите следующее, он будет использовать специализацию и штраф при компиляции:
// This is a pointer to T specialization!
template <class T> class Foo<T *> {
T * t;
public:
void foo(void)
{
t->bar();
}
};