我的代码中有一点问题。 我尝试使用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,并且我有一个错误。
答案 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);