Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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_Partial Specialization - Fatal编程技术网

C++ 动态分派的部分模板专门化

C++ 动态分派的部分模板专门化,c++,templates,partial-specialization,C++,Templates,Partial Specialization,我正在尝试为基于整数值(而不是类型)模板的函数编写动态调度程序。虽然我可以编写代码生成器或使用大型宏链来创建dispatcher源代码,但模板化解决方案似乎更为优雅 我已经将我的调度程序简化为一个简单的表单(实际上不做任何调度): //使用完全模板专门化可以很好地工作 模板 结构TestDispatcher1D{ int f(int n){ if(n==n)返回n;//用实际分派替换me 测试调度员1D t; 返回t.f(n); } }; 模板 结构TestDispatcher1D{ int f

我正在尝试为基于整数值(而不是类型)模板的函数编写动态调度程序。虽然我可以编写代码生成器或使用大型宏链来创建dispatcher源代码,但模板化解决方案似乎更为优雅

我已经将我的调度程序简化为一个简单的表单(实际上不做任何调度):

//使用完全模板专门化可以很好地工作
模板
结构TestDispatcher1D{
int f(int n){
if(n==n)返回n;//用实际分派替换me
测试调度员1D t;
返回t.f(n);
}
};
模板
结构TestDispatcher1D{
int f(int n){return-1;}
};
//部分模板专门化是有问题的
模板
结构TestDispatcher2D{
int f(int m,int n);
};
模板
结构TestDispatcher2D{
intf(intm,intn){return-1;}
};
模板
结构TestDispatcher2D{
intf(intm,intn){return-1;}
};
模板
结构TestDispatcher2D{
intf(intm,intn){return-1;}
};
模板
int TestDispatcher2D::f(int m,int n){
if((n==n)&&(m==m))返回n+m;//用实际分派替换我
if(m
在gcc 4.1.1上编译时,出现以下错误:

t.cpp: In member function 'int TestDispatcher2D::f(int, int) [with int M = 16, int N = 16]': t.cpp:63: instantiated from here t.cpp:40: error: no match for call to '(TestDispatcher2D) (int&, int&)' t.cpp:63: instantiated from here t.cpp:43: error: no match for call to '(TestDispatcher2D) (int&, int&)' t.cpp:63: instantiated from here t.cpp:47: error: no match for call to '(TestDispatcher2D) (int&, int&)' t、 cpp:在成员函数“int TestDispatcher2D::f(int,int)[其中int M=16,int N=16]中]: t、 cpp:63:从此处实例化 t、 cpp:40:错误:调用'(TestDispatcher2D)(int&,int&)不匹配 t、 cpp:63:从此处实例化 t、 cpp:43:错误:对“(TestDispatcher2D)(int&,int&)的调用不匹配 t、 cpp:63:从此处实例化 t、 cpp:47:错误:对“(TestDispatcher2D)(int&,int&)的调用不匹配 显然,当我尝试创建递归对象时,编译器并没有将其视为实例化新模板的请求


有什么建议吗?

您只是在递归调用中没有调用
f()
函数,而是试图“调用对象”:

你写道:

TestDispatcher2D<...> t;
return t(m,n);
testdispatcher2dt;
返回t(m,n);
但是你想要:

TestDispatcher2D<...> t;
return t.f(m,n);
testdispatcher2dt;
返回t.f(m,n);

您还可以编写TestDispatcher2D().f(mn,n)就是这样。谢谢我之前试着使用一些操作符()技巧,但没有解决这个问题。你甚至可以使f为static,所以你根本不需要构造一个临时对象。
TestDispatcher2D<...> t;
return t.f(m,n);