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

时间:2010-12-09 16:57:02

标签: c++ templates parameters default

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

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,我需要数百种不同的函数。

更新:感谢您的回复。我修改了我的问题描述,让你更好地了解我正在尝试做什么。

6 个答案:

答案 0 :(得分:8)

参考不能指向任何地方。

答案 1 :(得分:6)

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

如果没有实际的T1工作,编译器也无法直观地了解Vector<X>。参数2需要一个具体的参数类型。例如,如果第二个参数是Vector<T0>*,那就可以了,因为类型可以从参数1(不是默认值)中得到。否则,您必须在每次调用testfunction时指定模板参数。

添加有关您要实现的内容的信息可能会提供更好的答案。这看起来有点令人费解。

答案 2 :(得分:2)

我只是简单地重载函数。

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

答案 3 :(得分:1)

我更喜欢

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

答案 4 :(得分:1)

仅仅因为你在testfunction中为第二个参数给出了一个默认值,如果你不给它一些东西,编译器就无法导出T1。您需要明确说明类型。类似的东西:

testfuntion<int, float>(v0);

另外,正如其他人指出的那样,你需要找到一些正确声明第二个参数的方法,因为引用不能有“null”值。我个人喜欢this way

答案 5 :(得分:0)

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

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