特定专业通用容器的功能

Ben*_*rer 3 c++ templates vector generic-programming c++11

我正在尝试编写一个应该与包含相同类型的不同容器(std::vector、QVector)一起使用的算法:

template<class Container>
boolean findpeaks(cv::Mat &m, Container<std::pair<int, double>> &peaks) {
    // do stuff
    peaks.push_back(std::make_pair(1, 1.0));

    return true;
}
Run Code Online (Sandbox Code Playgroud)

这一个给了我

“容器”不是模板

template<template<typename> class Container>
Run Code Online (Sandbox Code Playgroud)

我得到:

错误:没有匹配的函数可用于调用“findpeaks(cv::MatExpr, std::vector >&)”

...

注意:模板参数推导/替换失败:

错误:模板参数数量错误(2,应该是 1)

调用代码:

cv::Mat m(data, true);
std::vector<std::pair<int, double>> peaks;

QVERIFY(daf::findpeaks(m.t(), peaks));
Run Code Online (Sandbox Code Playgroud)

我也尝试过这样的事情:

template<template< template<typename, typename> typename > class Container>
Run Code Online (Sandbox Code Playgroud)

警告:ISO C++ 禁止在模板模板参数中使用 typename 键;使用 -std=c++1z 或 -std=gnu++1z [-Wpedantic]

还有一些错误...

son*_*yao 5

std::vector有两个模板参数。

template<  
    class T,
    class Allocator = std::allocator<T>
> class vector;
Run Code Online (Sandbox Code Playgroud)

并且QVector有一个。您可以使用可变参数模板来做到这一点:

template<template <typename...> class Container>
bool findpeaks(cv::Mat &m, Container<std::pair<int, double>> &peaks) {
    // do stuff
    peaks.push_back(std::make_pair(1, 1.0));

    return true;
}
Run Code Online (Sandbox Code Playgroud)