C++ 建造师专业化要求

C++ 建造师专业化要求,c++,templates,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,

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

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;
}
到所有字段(a和b)的专业类


为什么它不起作用?为什么构造函数不是自动生成的?

每个类模板部分专用化都是一个单独的模板。必须为类模板部分专门化的每个成员提供定义。因此编译器看不到通用类模板的构造函数,也就是说,您必须为规范化提供构造函数


因为您没有为专门化提供任何构造函数,所以它提供了默认构造函数,该构造函数需要0/无参数。但是,由于您提供了2个参数,编译器正在抱怨。

编译器正在使用专门的模板类。它没有您定义的构造函数。因此它使用编译器生成的默认值。i、 e

S<char, int>::S()  // default constructor
S<char, int>::S(const S<char, int>&)  // copy constructor
S::S()//默认构造函数
S::S(常量S&)//复制构造函数
你现在的专业课差不多是这样的

template<typename A>
struct S {
    S();
    S(const S&);
};
template<typename A>
struct S_int : public S<A, int> {};
模板
结构{
S();
S(常数S&);
};
你需要的是

template<typename A>
struct S<A, int> {
    S(A a, int i) { .... }
};
模板
结构{
S(A,int i){…}
};

如果您真的想避免为每个类定义构造函数,只需使用如下继承模式

template<typename A>
struct S {
    S();
    S(const S&);
};
template<typename A>
struct S_int : public S<A, int> {};
模板
结构S_int:publicss{};
我不知道您想专门化什么,但正如@dyp所指出的,这里有一种避免重复成员和构造函数的方法:

template<typename A, typename B>
struct Base
{
    Base(A a, B b) : a(a), b(b) { }
    A a;
    B b;
};

template<typename A, typename B>
struct S : Base<A, B>
{
    using Base<A, B>::Base;
    // extensions...
};

template<typename A>
struct S<A, int> : Base<A, int>
{
    using Base<A, int>::Base;
    // specialized extensions...
};
模板
结构基
{
碱基(A,B):A(A),B(B){}
A A;
B B;
};
模板
结构S:Base
{
使用Base::Base;
//扩展。。。
};
模板
结构S:Base
{
使用Base::Base;
//专用扩展。。。
};

使用
基构造函数是C++11的一个特性。通过这个声明,您将引入基类的所有构造函数。但是您可以在派生类中添加更多。

您可以使用公共基类(模板)+继承构造函数作为解决方法(在C++11中)。
使用base::base
应该是
使用Base::Base
使用Base::Base