我有以下功能。
template<int m, int n>
void foo(float (&A)[m][n]){}
int main(){
float x[3][4], y[0][4];
foo<3,4>(x);
//if(false){ foo<0,4>(y); } // POSITION 1
}
当我注解POSITION 1
时,会抛出以下错误:
$ g++ minimum_example.cpp
.\minimum_example.cpp: In function 'int main()':
.\minimum_example.cpp:10:13: error: no matching function for call to 'foo<0, 4>(float [0][4])'
10 | foo<0,4>(y);
| ~~~~~~~~^~~
.\minimum_example.cpp:3:6: note: candidate: 'template<int m, int n> void foo(float (&)[m][n])'
3 | void foo(float (&A)[m][n]){}
| ^~~
.\minimum_example.cpp:3:6: note: template argument deduction/substitution failed:
$
问题是我无法在编译时捕获异常m==0
。最好是,我对一个不改变main的POV的调用语法的解决方案感兴趣。
1条答案
按热度按时间qco9c6ql1#
答案如下:
也就是说,您只需在第2行中将
(&A)
替换为A
。理由如下:
(&A)
* 可以 * 替换为A
,因为当$m〉0 $时,符号A[m][n]
将A作为引用传递。