2013-09-22 76 views
1

我有一个模板类,我遇到了一些问题。我有这个按照压在另一大类:使用默认参数混合模板函数的错误

value.push_back(x); 

作为XA unsigned int,值的模板类被称为List<unsigned int>和的push_back此功能:

template <class T> 
void List<T>::push_back(T a=T(),int l=1){ 
    (*this).resize((*this).size+l,a); 
} 

而且我在代码块以下错误:

...\mp.h|86|error: no matching function for call to 'List<unsigned int>::push_back(unsigned int)' 
...\mp.h|86|note: candidate is: 
...\list.h|36|note: void List<T>::push_back(T, int) [with T = unsigned int] 
...\list.h|36|note: candidate expects 2 arguments, 1 provided 

我不知道该怎么做,该函数已经为int的默认值,我已经尝试了2个不同的编译器,我真的不想在push_back中添加其他参数,以便它变成push_back(x,1)

回答

2

您是否在声明中包含默认值?

template <class T> 
struct List 
{ 
    void push_back(T a=T(),int l=1); 
}; 

一个好的编译器会拒绝编译它,如果你没有(或至少警告有关的差异),但只是要确定。

这是习惯性地“只是”实施模板成员级:

template <class T> 
struct List 
{ 
    void push_back(T a=T(),int l=1) 
    { 
     (*this).resize((*this).size+l,a); 
    } 
}; 
+0

我只是没你说的话和排序的工作,我得到另一个错误,我认为它没有这个问题做。我无法理解的是,为什么默认参数没有在声明中工作,而没有将函数模板化,以及为什么它可以在模板化时处于声明中。 – user2054583

+0

我无法确定。但是这个问题似乎只是在调用的时候,编译器没有提供默认的参数值(因此不会“添加”它)。默认参数只是一个呼叫站点语法糖。这是一个混乱的频繁来源。您可能想通过使用单独的重载来代替所有的混淆。 – sehe

+0

@ user2054583那么标准明确禁止在[dcl.fct.default]/6中除了类模板的成员函数外,在类定义之外出现的成员函数定义中的缺省参数将被添加到缺省集合由类定义中的成员函数声明提供的参数。类模板的成员函数的默认参数应在类模板中的成员函数的初始声明中指定。我只能猜测,这必须通过实例化或简化(考虑专业化)。 – dyp