Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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_Template Specialization - Fatal编程技术网

C++ C++;:部分模板专门化用例

C++ C++;:部分模板专门化用例,c++,templates,template-specialization,C++,Templates,Template Specialization,我观察到,每当模板类被专门化(部分/完全)时,所有成员函数都需要显式定义,否则就会出现错误。下面是一个例子 #include <iostream> template<typename T, typename U> //Primary struct test { void f() { std::cout << "\nPrimary"; } void g() { std::cout << "Called g()\n";} }; temp

我观察到,每当模板类被专门化(部分/完全)时,所有成员函数都需要显式定义,否则就会出现错误。下面是一个例子

#include <iostream>

template<typename T, typename U> //Primary
struct test
{
   void f() { std::cout << "\nPrimary"; }
   void g() { std::cout << "Called g()\n";}
};

template <typename T> //Specialization
struct test<T, int*>
{
   void f() { std::cout << "\nPartial Specialization"; }
};


template<> //Full specialization
struct test<int*, int*>
{
   void f() { std::cout << "\nFull Specialization\n"; }
};

int main()
{
    test<int, double> t1;
    t1.f();
    t1.g();

    test<double, int*> t2;
    t2.f();
    t2.g();

    test<int*, int*> t3;
    t3.f();
    t3.g();
}
#包括
模板//主
结构测试
{

void f(){std::cout我认为您在这里错误地理解了类专门化的概念。 类专门化不是继承
。专门化的类与初始类不同。二者之间不共享任何内容。因此,专门化的类中不存在任何
g()
方法


如果您正在寻找一种使方法不同的方法,那么您应该研究方法专门化。

我认为专门化的主要目的是定义“异常”,如果您希望以不同的方式处理某些数据类型

查看部分专业化考虑如下:

// NOT specialized
template <typename T>
struct test <T, T>
{
   ...
};

// partially specialized
template <typename T>
struct test <T*, T*>
{
  ...
}; 
//未专门化
样板
结构测试
{
...
};
//部分专业化
样板
结构测试
{
...
}; 
后一个示例已经部分专门化,因为您告诉编译器需要任何类型的指针。这当然很有用,因为您可能希望处理与非指针类型稍有不同的指针类型(例如检查是否为NULL)


我建议阅读

对于结构,用例非常有限(由于结构中的所有功能都需要重新实现的限制),但它不是零。在某些用例中,即使需要重新实现函数,也可以进行部分专门化。类专门化并不等同于继承!专门化的类是完全不同的类这是否回答了您的问题?