c++ - 构造函数特化要求

标签 c++ templates

我尝试专门化构造函数具有模板化参数的类,但我不想为每个模板专门化专门化构造函数。例如:

template<typename A, typename B>
struct S{
    S( A _a, B _b ) : a(_a), b(_b){}
    A a;
    B b;
};
//Partial specialization
template<typename A>
struct S<A, int>{
};
int main( int argc, char* argv[] ) {
    S<char, float> s0('1', 1.0);
    S<char, int> s1('1', 1);    //Compilation error
    return 0;
}

编译错误:

main.cpp:13:24: error: no matching function for call to ‘S<char, int>::S(char, int)’
  S<char, int> s1('1', 1);
                        ^
main.cpp:13:24: note: candidates are:
main.cpp:9:8: note: S<char, int>::S()
 struct S<A, int>{
        ^
main.cpp:9:8: note:   candidate expects 0 arguments, 2 provided
main.cpp:9:8: note: S<char, int>::S(const S<char, int>&)
main.cpp:9:8: note:   candidate expects 1 argument, 2 provided

如果我附加构造函数,编译将成功完成:

S( A _a, int _b ) : a(_a), b(_b){}

到具有所有字段(a 和 b)的专业类。

为什么不工作?为什么构造函数没有自动生成?

最佳答案

每个类模板偏特化都是一个单独的模板。您必须为类模板偏特化的每个成员提供定义。因此,编译器看不到通用类模板的构造函数,即您也必须为特化提供构造函数。

由于您没有为特化提供任何构造函数,它提供了需要 0/无参数的默认构造函数。但是,由于您提供了 2 个论点,编译器正在提示。

关于c++ - 构造函数特化要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22923072/

相关文章:

c++ - 是否允许 unique_prts 隐式转换其包含类型?

c++ - Qt通过代码关闭一个正在运行的窗口

c++ - 将库添加到调试配置 - QtCreator、VC 编译器

c++ - 什么时候使用模板显式实例化?

c++ - 编译时如何生成类似 OR 的语句? C++

c++ - 从 64 位转换为 32 位时,Gcc 不会给出任何警告

c++ - 使用 QListWidget 的 Qt 命令日志

c++ - 为什么我不能通过模板参数声明一种类型的友元函数但可以使用别名

c++ - 我可以告诉我的类是从哪个模板实例类继承的吗?

java - JSF 2 : How build components correctly?