Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板参数变元_C++_Templates_Variadic Templates - Fatal编程技术网

C++ 可变模板参数变元

C++ 可变模板参数变元,c++,templates,variadic-templates,C++,Templates,Variadic Templates,我的代码有点问题。 我试图创建一个带有可变参数的函数,但当我编译它时,它失败了,我真的不明白为什么。 所以如果有人能帮我 以下是我的功能: QuerySet.hpp: template <typename T> class QuerySet { template<typename U,typename ... Args> QuerySet& filter(const std::string& colum,Args ... args,const

我的代码有点问题。 我试图创建一个带有可变参数的函数,但当我编译它时,它失败了,我真的不明白为什么。 所以如果有人能帮我

以下是我的功能:

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;
}
模板
类查询集
{
模板
查询集和过滤器(常量标准::字符串和列,参数…参数,常量标准::字符串和操作,常量U和值);
//...
}
模板
模板
查询集和查询集::过滤器(常量标准::字符串和列,参数…参数,常量标准::字符串和操作,常量U和值)
{
//一些工作
归还*这个;
}
main.cpp QuerySet QuerySet; queryset.filter(Perso::_master,Perso:_lvl,“gt”,4)//第135行

注: Perso::_master和Perso:_lvl是一些静态常量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>]
g++-g-std=c++0x-I”/my_path/cpp ORM“-lmysqlcppconn-o main.o-c main.cpp;
main.cpp:在函数“int main(int,char**)”中:
main.cpp:135:46:erreur:调用“orm::QuerySet::filter(常量字符串&,常量字符串&,常量字符串&,int)”时没有匹配的函数
main.cpp:135:46:注:候选人为:
/my_path/QuerySet.hpp:18:23:注意:模板orm::QuerySet&orm::QuerySet::filter(常量字符串&,Args…,常量字符串&,常量U&)[其中U=U,Args={Args…},T=Perso,std::string=std::basic_string]
资料:
我使用GCC版本4.6.4(Ubuntu/LimARO 4.6.4-1Ubuntu1~12.04),但我尝试使用Gcc4.8,并且我有一个错误。

< P>变量参数包必须出现在函数签名的结尾,而不是在中间。

为了更好地理解,请阅读以下内容:

>P>变量参数包必须出现在函数签名的结尾,而不是在中间。

为了更好地理解,请阅读以下内容:

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

n3337,14.8.2.1/1[临时扣减呼叫]

通过将每个函数模板参数类型(称为p)与 调用的相应参数的类型(称为A),如下所述。
[…]
对于出现在参数声明列表末尾的函数参数包, 将调用的每个剩余参数的类型A与 函数参数包。每一次比较都会推断模板中后续位置的模板参数 模板参数包由函数参数包展开对于函数参数包 不会出现在参数声明列表的末尾,参数包的类型为非推断类型 上下文。
[……]

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

您可以直接指定模板参数,但我认为这不是您想要的。例如:

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

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

n3337,14.8.2.1/1[临时扣减呼叫]

通过将每个函数模板参数类型(称为p)与 调用的相应参数的类型(称为A),如下所述。
[…]
对于出现在参数声明列表末尾的函数参数包, 将调用的每个剩余参数的类型A与 函数参数包。每一次比较都会推断模板中后续位置的模板参数 模板参数包由函数参数包展开对于函数参数包 不会出现在参数声明列表的末尾,参数包的类型为非推断类型 上下文。
[……]

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

您可以直接指定模板参数,但我认为这不是您想要的。例如:

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

尝试将包移到末尾。末尾可以,但我需要它作为用户的第一个参数。如果您希望函数可导入,请使用参数包结束函数。您可以使用静态断言、sfinae或其他技术来确保包中的最后一个参数是字符串和值。顺便说一句,也使用完美转发。不要担心完美转发。以下是最简单的代码;)我将看一看静态断言和SFINAERY,将包移动到最后。最后可以,但我需要它作为用户的第一个参数。如果您希望它是可引导的,请使用参数包结束您的函数。您可以使用静态断言、sfinae或其他技术来确保包中的最后一个参数是字符串和值。顺便说一句,也使用完美转发。不要担心完美转发。以下是最简单的代码;)我来看看静态断言和sfinaeArf,好吗。谢谢你的回答。Arf,好的。谢谢你的回答。嗯,有些包装需要放在最后(即可扣除的包装)。但不是每一包。好吧,有些包需要在最后(即可推断的包)。但不是每一包。