在方法的参数列表中出错

时间:2017-07-19 14:09:59

标签: c++ methods compiler-errors

使用this thread as help我想计算两个向量之间的距离。所以我的方法是:

template <typename T>
double  vectors_distance(vector<double> vec1, vector<double> vec2) {
    std::vector<double> aux;

    std::transform(vec1.begin(), vec1.end(), vec2.begin(), std::back_inserter(aux), 
        [](double element1, double element2) {return pow((element1 - element2), 2); 
    });
    aux.shrink_to_fit();

    return  std::sqrt(std::accumulate(aux.begin(), aux.end(), 0.0));
}

在另一种方法中,我创建了两个vector<double> numbers, numbers1并用一些值填充它们,如下所示:

stringstream ss(coordSynth);
        double num;
        while (ss >> num) {
            numbers.push_back(num);
            cout << typeid(numbers).name() << endl;
        }

修改

作为背景知识:coordSynth是一个字符串,其中包含doubles作为值(即:“0.0,45.3,2.0”)。对于number1发生的情况完全相同(对于number)。 很好,现在我正在调用vectors_distance(numbers, numbers1);并收到错误E0304 No instance of function template "vectors_distance" matches the argument list.。但是怎么样?我的方法有两个参数,我还有两个向量?

1 个答案:

答案 0 :(得分:0)

原因是您已将该函数指定为模板,但这两个函数参数都与模板参数无关。

如果您希望该功能仅适用于double vectors_distance(vector<double> vec1, vector<double> vec2) { // same body you have } ,则该功能不需要是模板。

std::vector<T>

如果您希望该函数适用于T(假设pow()是可以提供给double的类型等),请将其保留为模板,然后更改{函数内的{1}}到T。例如;

template <typename T>
T vectors_distance(vector<T> vec1, vector<T> vec2)
{
      // same function body, but replace "double" by "T" everywhere
}

其他一些评论。

首先,最好通过std::vector引用传递const个参数,而不是按值传递。

其次,没有必要构建一个临时向量来保存中间结果。只需使用更好的算法。例如,可以编写非模板版本

double  vectors_distance(const vector<double> &vec1, const vector<double> &vec2)
{
     return std::sqrt(
              std::inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0.0,
                                 std::plus<double>(),
                                 [](double e1, double e2) {return (e1-e2)*(e1-e2);}
                                )
             );
}

阅读std::inner_product()的文档,了解其功能。