如何对 GList 类进行部分特化以便可以存储 I (即 I*) 的指针?
template <class I>
struct TIList
{
typedef std::vector <I> Type;
};
template <class I>
class GList
{
private:
typename TIList <I>::Type objects;
};
如何对 GList 类进行部分特化以便可以存储 I (即 I*) 的指针?
template <class I>
struct TIList
{
typedef std::vector <I> Type;
};
template <class I>
class GList
{
private:
typename TIList <I>::Type objects;
};
你不需要专门允许它。它已经可以存储指针。
GList<int*> ints;
无论如何,如果您想将 GList 专门用于指针,请使用以下语法。
template <class I>
class GList<I*>
{
...
};
然后就像I
在任何普通模板中一样使用。在上面带有 的示例中GList<int*>
,将使用指针特化,并且I
将是int
。
上一篇文章指出您不需要专门针对指针类型,但您可以。
考虑以下:
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();
}
};