C++ - 模板参数推导/替换失败

Sev*_*rin 5 c++ templates

我的目标是能够在std :: vector上使用算术运算符.请考虑以下示例:

#include <vector>

using namespace std;

template <class S, class T, class U> vector<U> operator+(const vector<S> &a, const vector<T> &b){
    vector<U> result;
    result.reserve(a.size());
    for(int i = 0; i < a.size();++i){
        result[i] = a[i] + b[i];
    }
    return result;
}

int main(int argc, char** argv) {
    vector<double> bla;
    bla = bla + bla;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,因为编译器无法推导出模板参数U(它不是MWE,但我试图提供一个有意义的示例).为什么会这样?我知道在这里使用三个模板参数可能没有意义.我的想法是,在类型S和T都提供匹配的"+" - 具有不同返回类型的实现的情况下,我可以同时处理这两种情况.或者是歧义问题?我只是想知道编译器是否应该无法推导出U.当然下面的代码工作正常:

#include <vector>

using namespace std;

template <class S, class T> vector<S> operator+(const vector<S> &a, const vector<T> &b){
    vector<S> result;
    result.reserve(a.size());
    for(int i = 0; i < a.size();++i){
        result[i] = a[i] + b[i];
    }
    return result;
}

int main(int argc, char** argv) {
    vector<double> bla;
    bla = bla + bla;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_* A. 1

您可以使用通用类型来完成此任务

#include <vector>
#include <type_traits>

using namespace std;

template <class S, class T> 
vector<typename std::common_type<S, T>::type> operator+(const vector<S> &a, const vector<T> &b)
{
    vector<typename std::common_type<S, T>::type> result;
    result.reserve(a.size());
    for(unsigned int i = 0; i < a.size();++i){
        result[i] = a[i] + b[i];
    }
    return result;
}

int main() {
    vector<double> bla;
    bla = bla + bla;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

实例

编辑:正如 Jarod42 建议的那样,您也可以使用vector<decltype(a[0] + b[0])>另一种可能的返回类型(可能与 common_type 不同)。请记住,后一个需要尾随返回类型或std::declval (C++11)