Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ 如何从模板类传递函数 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 模板 上课{ 公众: T值; int和(intvl1,intvl2){返回vl1+vl2;}; }; 模板 第二类{ 公众: T值; 无效打印(常量标准::函数和函数){ 注意到 #include <iostream> #include <windows.h> #include <string.h> #include <functional> #include <stdint.h> #include <stdio.h> using namespace std; template <typename T> class someclass { public: T value; int sum(int vl1, int vl2) { return vl1 + vl2; }; }; template <typename T> class someclass2 { public: T value; void print(const std::function<int(int, int)>& func) { cout << func(3, 4) << '\n'; }; }; int main(int argc, const char **argv) { someclass<int> obj1; someclass2<int> obj2; obj2.print(obj1.sum); }_C++_Templates - Fatal编程技术网

C++ 如何从模板类传递函数 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 模板 上课{ 公众: T值; int和(intvl1,intvl2){返回vl1+vl2;}; }; 模板 第二类{ 公众: T值; 无效打印(常量标准::函数和函数){ 注意到 #include <iostream> #include <windows.h> #include <string.h> #include <functional> #include <stdint.h> #include <stdio.h> using namespace std; template <typename T> class someclass { public: T value; int sum(int vl1, int vl2) { return vl1 + vl2; }; }; template <typename T> class someclass2 { public: T value; void print(const std::function<int(int, int)>& func) { cout << func(3, 4) << '\n'; }; }; int main(int argc, const char **argv) { someclass<int> obj1; someclass2<int> obj2; obj2.print(obj1.sum); }

C++ 如何从模板类传递函数 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 模板 上课{ 公众: T值; int和(intvl1,intvl2){返回vl1+vl2;}; }; 模板 第二类{ 公众: T值; 无效打印(常量标准::函数和函数){ 注意到 #include <iostream> #include <windows.h> #include <string.h> #include <functional> #include <stdint.h> #include <stdio.h> using namespace std; template <typename T> class someclass { public: T value; int sum(int vl1, int vl2) { return vl1 + vl2; }; }; template <typename T> class someclass2 { public: T value; void print(const std::function<int(int, int)>& func) { cout << func(3, 4) << '\n'; }; }; int main(int argc, const char **argv) { someclass<int> obj1; someclass2<int> obj2; obj2.print(obj1.sum); },c++,templates,C++,Templates,不以任何方式使用其所有者类的成员,可以安全地将其声明为静态,在这种情况下,此代码将正常工作 此代码的问题在于成员函数的类型与独立函数不同。它是类someclass的成员,因此其类型为int(someclass::*)(int,int),要调用它,需要该类的实例 一般情况下,字面解决方案是在lambda表达式创建的函子中隐藏此的过程: int sum(int vl1, int vl2) { return vl1 + vl2; }; 您可以使用std::bind来执行此操作 obj2.print(

不以任何方式使用其所有者类的成员,可以安全地将其声明为静态,在这种情况下,此代码将正常工作

此代码的问题在于成员函数的类型与独立函数不同。它是类
someclass
的成员,因此其类型为
int(someclass::*)(int,int)
,要调用它,需要该类的实例

一般情况下,字面解决方案是在lambda表达式创建的函子中隐藏
的过程:

int sum(int vl1, int vl2) { return vl1 + vl2; };

您可以使用
std::bind
来执行此操作

obj2.print( [&](int a, int b)-> int { return obj1.sum(a,b); } ); 
int main(int argc,const char**argv)
{
obj1类;
someclass2-obj2;
使用名称空间std::占位符;
打印(std::bind(&someclass::sum,&obj1,_1,_2));
}

长话短说,您应该使用
&someclass::sum
并使
sum
成为
static
成员函数。@nm或使用lambda调用它,或使用
std::bind
ok.ty作为答案。还有其他方法可以这样做吗?@mykhailoogordnichuk相同什么?或者您可以使用
std::bind(obj1,&someclass::sum)
或lambda(但在这种情况下两者都是不必要的,因为您的
总和
在任何方面都不使用
这个
)。这很有趣。因为我确信我尝试过这个方法,但出现了错误(这就是为什么我会遇到这个问题),但现在当我复制并粘贴它时,它工作了。我可能出了点问题。不管怎样,这是因为answer@MykhailoOgorodniichukbind在某些实现中是反复无常的,特别是当编译器不是完全标准的时候。如果您检查一下russian stackoverflow,您会发现这方面的例子和讨论。
int main(int argc, const char **argv)
{
    someclass<int> obj1;
    someclass2<int> obj2;

    using namespace std::placeholders;
    obj2.print(std::bind(&someclass<int>::sum, &obj1, _1, _2));
}