我正在尝试在模板函数中使用默认参数。以下是我正在尝试做的事情的最小例子:
template <typename T0, typename T1>
void sort(Vector<T0> &v0,Vector<T1> &v1=0)
{
//sort v0, if (v1 != 0) sort it according to v0
}
#include "sort.h"
Vector<int> v0;
sort(v0);
这不编译;编译器给出错误“没有匹配函数来调用'sort'”。
基本上这个函数应该对向量v0(任意数据类型)进行排序。另外,可以给出以与向量v0相同的方式排序的第二向量v1(任意)作为参数。当然,我可以简单地通过使用重载函数来解决这个问题,但由于我想将其他向量的列表扩展到5,我需要数百种不同的函数。
更新:感谢您的回复。我修改了我的问题描述,让你更好地了解我正在尝试做什么。
答案 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
}