Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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++_Templates_Overloading_Partial Specialization_Default Arguments - Fatal编程技术网

C++ 默认模板参数在(部分专用)类模板重载解析中的作用

C++ 默认模板参数在(部分专用)类模板重载解析中的作用,c++,templates,overloading,partial-specialization,default-arguments,C++,Templates,Overloading,Partial Specialization,Default Arguments,解释以下程序的行为: template<typename A, typename B = int > struct FirstWins { static constexpr int i = 1; }; template<typename A> struct FirstWins<A, float/* anything different from int */ > { static constexpr int i = 2; }; templat

解释以下程序的行为:

template<typename A, typename B = int >
struct FirstWins {
    static constexpr int i = 1;
};
template<typename A>
struct FirstWins<A, float/* anything different from int */ > {
    static constexpr int i = 2;
};

template<typename A, typename B = int >
struct SecondWins {
    static constexpr int i = 1;
};
template<typename A>
struct SecondWins<A, int > {
    static constexpr int i = 2;
};

int main()
{
    typedef void Whatever_t;
    cout << FirstWins < Whatever_t >::i << endl;  // prints 1
    cout << SecondWins< Whatever_t >::i << endl;  // prints 2
    return 0;
}
模板
结构第一胜{
静态constexpr int i=1;
};
模板
struct FirstWins以某种方式解释了此规则,但同样没有明确解释)。

模板
结构{
//...
};
可视为

template<typename A, typename B = int >
struct S;
// So S<A> is S<A, int>

// Primary template
template<typename A, typename B>
struct S
{
   //...
};

// Possible specialization as
template<typename A>
struct S<A, int>
{
   //...
};
模板
结构;
//所以S就是S
//主模板
模板
结构
{
//...
};
//可能的专业化
模板
结构
{
//...
};

然后,可以更清楚地使用哪个实例化。

当代码不提供类型时,默认参数只提供一个类型。它对选择专门化没有影响。我认为您对默认模板参数的用途感到困惑。在您的示例中,它只是表示
FirstWins
解析为
FirstWins
FirstWins
定义的实际选择发生在
B
int
的“替换”之后@Holt:当然,但我的问题确实与
SecondWins
有关。在这种情况下,
SecondWins
优先于
SecondWins
@L.Bruce,因为
SecondWins
SecondWins
在模板选择方面没有什么不同,因此专门化
SecondsWins
优先于非专门化。默认模板参数在这里对解析没有影响。@霍尔特:我相信,在某种程度上它确实有影响。查看
FirstWins
。默认参数
B=int
与显式参数
float
之间存在不匹配,导致选择第一个参数<代码>B
默认为任何非浮动的值都会产生不同。
template<typename A, typename B = int >
struct S;
// So S<A> is S<A, int>

// Primary template
template<typename A, typename B>
struct S
{
   //...
};

// Possible specialization as
template<typename A>
struct S<A, int>
{
   //...
};