如何对类GList进行部分特化,以便可以存储I的指针(即I *)?
template <class I>
struct TIList
{
typedef std::vector <I> Type;
};
template <class I>
class GList
{
private:
typename TIList <I>::Type objects;
};
答案 0 :(得分:7)
您无需专门设置即可。它可以存储指针。
GList<int*> ints;
无论如何,如果你想将GList专门用于指针,请使用以下语法。
template <class I>
class GList<I*>
{
...
};
然后就像在任何普通模板中一样使用I
。在上面使用GList<int*>
的示例中,将使用指针特化,而I
将为int
。
答案 1 :(得分:5)
上一篇文章指出,您不需要专门针对指针类型,但您可能会这样做。
请考虑以下事项:
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();
}
};