Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针的部分专门化,c++;_C++_Templates_Pointers_Partial Specialization - Fatal编程技术网

C++ 指针的部分专门化,c++;

C++ 指针的部分专门化,c++;,c++,templates,pointers,partial-specialization,C++,Templates,Pointers,Partial Specialization,如何对类GList进行部分专门化,以便能够存储I(即I*)的指针 模板 结构砖工 { typedef std::向量类型; }; 模板 课堂英语 { 私人: typename TIList::Type对象; }; 您不需要专门从事这项工作。它已经可以存储指针了 GList<int*> ints; glistints; 无论如何,如果你想专门为指针使用GList,请使用以下语法 template <class I> class GList<I*> {

如何对类GList进行部分专门化,以便能够存储I(即I*)的指针

模板
结构砖工
{
typedef std::向量类型;
};
模板
课堂英语
{
私人:
typename TIList::Type对象;
};

您不需要专门从事这项工作。它已经可以存储指针了

GList<int*> ints;
glistints;
无论如何,如果你想专门为指针使用GList,请使用以下语法

template <class I>
class GList<I*>
{
    ...
};
模板
课堂英语
{
...
};

然后像在任何普通模板中一样使用
I
。在上面带有
GList
的示例中,将使用指针专门化,而
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{
T;
无效foo(无效)
{
t、 bar();//如果t是指针,我们应该使用操作符->对吗?
}
};
int main(int argc,char*argv[])
{
富特;
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();
    }
};
//这是指向T专门化的指针!
模板类Foo{
T*T;
公众:
无效foo(无效)
{
t->bar();
}
};

这是个非常非常糟糕的主意。在专业领域,你永远不应该改变语义学。当你这样做的时候,你会得到像
std::vector
这样的东西。如果将
Foo
std::shared_指针一起使用,会发生什么情况?它不会使用引用语义,所以你也会专门研究所有可能的智能指针吗?否决投票只是因为你认为这是一个(真的)坏主意?当需要专门化时,这是一个有效的例子,您谈论的是设计问题。专门化类GList必须有自己的私有数据成员对象实现?是的,专门化与原始基础模板不共享任何内容。您必须重新编写所有成员变量和成员函数(或者尽可能将它们分解为一个公共基类)。我尝试专门化指针的唯一方法:void-GList方法(){…}和void-GList方法{…}。但编译器无法识别它们之间的差异……是的,你不能专门化模板类的单个成员函数,你必须专门化整个类。通常的解决方法是将两者之间共享的所有公共部分放入一个公共基类中,并使它们都从该基类继承。
// This is a pointer to T specialization!
template <class T> class Foo<T *> {
    T * t;
public:
    void foo(void)
    {
        t->bar();
    }
};