我试图创建一个模板函数,在蒙特卡罗模拟中进行一些加权采样。它在下面。 input_data将是静态分配的数组(即data [33]),动态分配的数组或向量。
template <class myType>
int init_roulette_calcs(myType &input_data, int inputlength, int *(&output_cdf), int highclassix, int weight)
{
sort(input_data, input_data + inputlength); //where the error occurs
//other code:
output_cdf = new int [inputlength];
int k = 1;
for (int i = 0; i < inputlength; i++)
{
output_cdf[i] = k;
if (i+1 < highclassix) k++;
else k += weight;
}
return output_cdf[inputlength-1];
}
代码将无法编译,因为模板函数无法推断出对sort进行调用的参数。这可能是一个愚蠢的问题,但我需要做些什么来确保排序能够正常工作?
Error 4 error C2784: 'std::_Vb_iterator<_Alloc> std::operator
+(_Alloc::difference_type,std::_Vb_iterator<_Alloc>)' : could not deduce template argument for
'std::_Vb_iterator<_Alloc>' from 'int' j:\rdm\lrgv_2011-07-21\lrgv_src\lrgv.h 398
提前感谢您的帮助。
答案 0 :(得分:2)
在你的代码中,input_data是一个引用,但sort需要它作为指向数组开头的指针。它应该是:
int init_roulette_calcs(myType input_data[], int inputlength, …
虽然使用这样一个模板是正确的STL用法,但用户可以提供任何类型的随机访问开始和结束迭代器。因此,您可以稍后切换到矢量或任何其他可以处理的容器......
template <class InputIterator>
int init_roulette_calcs(InputIterator begin, InputIterator end, int *(&output_cdf), int highclassix, int weight)
答案 1 :(得分:2)
如果你放入一个数组,那么数组名实际上是指向第一个元素的指针,而数组name + x
是x
元素的指针 - 所以你要正确使用这个部分。
问题是向量不是这种情况,这就是为什么你需要使用.begin()
和.end()
函数来获取指向这些位置的指针。
您可以尝试通过拉取解除引用的开始/结束元素的地址进行排序 - 这可能会让您将矢量视为与数组相同。
答案 2 :(得分:1)
sort(&input_data, &input_data + inputlength);
^^^ ^^^
我希望你传递的参数实际上是对数组中第一个元素的引用。