可变参数模板参数参数

时间:2013-09-17 13:56:40

标签: c++ templates variadic-templates

我的代码中有一点问题。 我尝试使用variadic参数创建一个函数,但是当我编译它时,它失败了,我真的不明白为什么。 所以,如果有人能帮助我......

这是我的功能:

QuerySet.hpp:

template <typename T>
class QuerySet
{
   template<typename U,typename ... Args>
   QuerySet& filter(const std::string& colum,Args ... args,const std::string& operation, const U& value);
   //...
}

template<typename T>
template<typename U,typename ... Args>
QuerySet<T>& QuerySet<T>::filter(const std::string& colum,Args ... args,const std::string& operation, const U& value)
{
     //some job
     return *this;
}

的main.cpp        QuerySet查询集;        queryset.filter(Perso :: _主,Perso :: _ LVL, “GT”,4); //第135行

注意:   Perso :: _ master和Perso :: _ lvl是一些静态const std :: string;

错误:

g++ -g -std=c++0x -I"/my_path/cpp-ORM" -lmysqlcppconn   -o main.o -c main.cpp;
main.cpp: In function ‘int main(int, char**)’:
main.cpp:135:46: erreur: no matching function for call to ‘orm::QuerySet<Perso>::filter(const string&, const string&, const string&, int)’
main.cpp:135:46: note: candidate is:
/my_path/QuerySet.hpp:18:23: note: template<class U, class ... Args> orm::QuerySet<T>& orm::QuerySet::filter(const string&, Args ..., const string&, const U&) [with U = U, Args = {Args ...}, T = Perso, std::string = std::basic_string<char>]

信息: 我使用gcc版本4.6.4(Ubuntu / Linaro 4.6.4-1ubuntu1~12.04),但我尝试使用gcc4.8,并且我有一个错误。

2 个答案:

答案 0 :(得分:4)

可变参数包必须出现在函数签名的末尾,而不是在中间。

为了更好地理解,请阅读: Variadic function template with pack expansion not in last parameter

答案 1 :(得分:3)

永远无法调用您的函数,这是无法推断出模板参数的上下文:

n3337,14.8.2.1/1 [temp.deduct.call]

  

模板参数推导是通过比较每个函数模板参数类型(称之为P)来完成的   调用的相应参数的类型(称之为A),如下所述   [...]
  对于发生在parameter-declaration-list末尾的函数参数包,   将调用的每个剩余参数的类型A与该声明符的类型P进行比较   功能参数包。每个比较推导出后续位置的模板参数   模板参数包由函数参数包扩展。 对于函数参数包   在参数声明列表的末尾不会出现,参数包的类型是非推导的   上下文。
  [...]

将参数包移动到函数参数列表的末尾。

您可以明确指定模板参数,但我认为这不是您想要的。 E.g:

q.filter<int, int, int>("oi", 1, 2, "oi", i);