我尝试专门化构造函数具有模板化参数的类,但我不想为每个模板专门化专门化构造函数。例如:
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/