发送阵列指针/模板参考

时间:2017-08-09 21:35:30

标签: c++ arrays templates reference parameter-passing

我编写了一个简单的程序,将数组if [[ $i == *"TCP Profile"* ]] || [[ $i == *"OneConnect"* ]] || [[ $i == *"HTTP Profile"* ]]; then : else echo "test" fi 发送到名为ARRAY_MAN的函数,该函数然后修改数组的内容:

array[]

编译并运行。但是如果我用这一行替换标记为#include <vector> #include <iostream> template <class Var, class T, std::size_t N, class... Args> void ARRAY_MAN(Var variable, T(&)[N], uint32_t numParams, Args... args) { std::vector<T> arguments{args...}; if(arguments.size() != numParams) throw std::runtime_error("mismatch"); for(uint32_t i = 0; i < numParams; ++i) variable[i] = arguments[i]; } int main(int argc, char* argv[]) { int array[] = {1,2,3}; // (*) // print array before sending for(uint32_t i = 0; i < 3; ++i) std::cout << array[i] << " "; std::cout << std::endl; ARRAY_MAN(array, array, 3, 34, 56, 10); // print array after sending for(uint32_t i = 0; i < 3; ++i) std::cout << array[i] << " "; std::cout << std::endl; return 0; } 的行:

(*)

我收到此错误:

  

没有匹配函数来调用'ARRAY_MAN(int *&amp;,int *&amp;,int,int,   int,int)'

如何将第二个int *array = new int(3); 发送到ARRAY_MAN函数?

1 个答案:

答案 0 :(得分:2)

只需阅读编译器错误消息:

$ g++ --std=c++14 -o a a.cpp
a.cpp: In function ‘int main(int, char**)’:
a.cpp:26:42: error: no matching function for call to ‘ARRAY_MAN(int*&, int*&, int, int, int, int)’
     ARRAY_MAN(array, array, 3, 34, 56, 10);
                                          ^
a.cpp:5:6: note: candidate: template<class Var, class T, long unsigned int N, class ... Args> void ARRAY_MAN(Var, T (&)[N], uint32_t, Args ...)
 void ARRAY_MAN(Var variable, T(&)[N], uint32_t numParams, Args... args)
      ^
a.cpp:5:6: note:   template argument deduction/substitution failed:
a.cpp:26:42: note:   mismatched types ‘T [N]’ and ‘int*’
     ARRAY_MAN(array, array, 3, 34, 56, 10);

函数的第二个参数是对固定长度数组的引用,而不是对指针的引用。如果您的函数参数是T[]T[N]T*,则所有(AFAICR)都相同 - 采用指针。但固定长度数组引用是特殊的。另见:

What is useful about a reference-to-array parameter?

你可以说这是一种超越C的向后兼容性的方法,并且对函数有“真正的”数组参数。