使用模板推导传递数组时的可变长度数组错误

时间:2013-07-27 00:53:43

标签: c++ templates c++11

您好在编译以下内容时遇到错误。我不确定为什么会这样,如果我将这些更改为const值,如[10] [20]它可以工作,但似乎不喜欢变量,即使这是一个声明,所以它不会改变维度。我很困惑,为什么这是错误发生请帮助。请参阅以下代码:

#include <iostream>

template <size_t X, size_t Y>
void fun (int (&array)[X][Y])
{
    std::cout << " do something fun " << std::endl;
}

int main ( int argc, char *argv[] )
{
  size_t row (10);
  size_t col (20);

  int data1[10][20];
  fun ( data1 );// compiles

  int data2[row][col];
  fun ( data2 );// fails

  return 0;
}




g++ -I/usr/include -I/usr/local/include -std=c++11 -pthread -O3 -Wall -c main.cpp -o main.o
main.cpp: In function ‘int main(int, char**)’:
main.cpp:18:15: error: no matching function for call to ‘fun(int [(((sizetype)(((ssizetype)row) + -1)) + 1)][(((sizetype)(((ssizetype)col) + -1)) + 1)])’
main.cpp:18:15: note: candidate is:
main.cpp:4:6: note: template<long unsigned int X, long unsigned int Y> void fun(int (&)[X][Y])
main.cpp:4:6: note:   template argument deduction/substitution failed:
main.cpp:18:15: note:   variable-sized array type ‘int [(((sizetype)(((ssizetype)row) + -1)) + 1)][(((sizetype)(((ssizetype)col) + -1)) + 1)]’ is not a valid template argument
make: *** [main.o] Error 1

1 个答案:

答案 0 :(得分:5)

int data2[row][col];不是标准C ++,因为rowcol不是常量表达式。您的编译器有一个扩展,允许您使用具有非常量维度的数组,但是这样的野兽无法匹配需要具有常量维度的普通数组的模板签名。

鉴于rowcol在您的计划中实际上并没有变化,在这种情况下,您可以通过将const声明为row来完全避免此问题,以便colint main ( int argc, char *argv[] ) { const size_t row (10); const size_t col (20); int data1[10][20]; fun ( data1 );// compiles int data2[row][col]; fun ( data2 );// compiles too! return 0; } 常量表达式:

{{1}}