我编写了一个简单的程序,将数组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函数?
答案 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的向后兼容性的方法,并且对函数有“真正的”数组参数。