繁体   English   中英

模板函数(C ++)中的默认参数

[英]Default parameters in template functions (C++)

我正在尝试在模板函数中使用默认参数。 以下是我要做的事情的最小示例:

sort.h中

template <typename T0, typename T1>
void sort(Vector<T0> &v0,Vector<T1> &v1=0)
{
    //sort v0, if (v1 != 0) sort it according to v0
}

main.cpp中

#include "sort.h"
Vector<int> v0;
sort(v0);

这不会编译; 编译器给出错误“没有匹配的函数来调用'sort'”。

基本上,此函数应对向量v0(任意数据类型)进行排序。 另外,可以给出以与向量v0相同的方式排序的第二向量v1(任意)作为参数。 当然,我可以简单地通过使用重载函数来解决此问题,但是由于我想将附加向量的列表扩展到5个,因此需要数百种不同的函数。

更新:感谢您到目前为止的答复。 我已经修改了问题描述,以使您更好地了解我要做什么。

引用不能指向任何内容。

您不能将引用默认为0。您必须使用指针来执行此操作(如果您坚持要求的话)。

如果没有实际的Vector<X> ,编译器也无法了解T1是什么。 例如,参数2需要一个具体的参数类型。如果第二个参数是Vector<T0>* ,则可以,因为该类型可以与参数1分开(未默认)。 否则,您必须在每次调用testfunction指定模板参数。

添加有关您要达到的目标的信息可能会提供更好的答案。 这似乎有点令人费解。

我只是简单地重载函数。

template <typename T0, typename T1>
void sort(Vector<T0> &v0,Vector<T1> &v1)
{
    //do something
}
void sort(Vector<T0> &v0)
{
    //do something
}

我会比较喜欢

template <typename T0, typename T1>
void testfunction(Vector<T0> &v0,const Vector<T1> &v1 = Vector<T1>() )
{
    //do something
}

仅仅因为您为testfunction中的第二个参数提供了默认值,如果您不给T1继续操作,编译器就无法导出T1。 您需要明确声明类型。 就像是:

testfuntion<int, float>(v0);

另外,正如其他人指出的那样,由于引用不能具有“空”值,因此您需要找到某种方法来正确声明第二个参数。 我个人喜欢这种方式

您必须将其更改为使用指针:

template <typename T0, typename T1>
void testfunction(Vector<T0>* v0, Vector<T1>* v1 = 0)
{
    //do something
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM