gpt4 book ai didi

c++ - 与模板函数一起使用时没有模板结构的隐式转换

转载 作者:行者123 更新时间:2023-11-30 04:47:30 26 4
gpt4 key购买 nike

考虑以下代码示例:

template<typename T>
struct foo
{
operator foo<double>() const
{
return foo<double>();
}
};

template<typename T>
void bar(foo<T> a, foo<T> b)
{
//
}

int main()
{
foo<double> a;
foo<float> b;

bar(a, b); // error: no matching function

return 0;
}

编译时会出现调用bar 时无法找到匹配函数的错误.为什么这不起作用,即使 foo<float>有一个到 foo<double> 的隐式转换运算符?

void bar_non_template(foo<double> a, foo<double> b) {} // this works

template<>
void bar(foo<double> a, foo<double> b) {} // template specialization doesn't work

如果我为模板参数使用两种类型,它可以工作,但我想将它用于我正在编写的 3d vector 类,并且我担心函数返回类型的数据丢失。示例:

template<typename T, typename U>
vec3d</* T or U? one is possible loss of data */> operator + (
const vec3d<T> &lhs, const vec3d<U> &rhs) {...}

所以我的另一个问题是,是否有可能确定两种给定类型中哪种更广泛/更准确?

编辑:

编译器错误:

g++:

error: no matching function for call to 'bar(foo<double>&, foo<float>&)'  
note: candidate: template<class T> void bar(foo<T>, foo<T>)
note: template argument deduction/substitution failed:
note: deduced conflicting types for parameter 'T' ('double' andd 'float')

VC++:

error C2672: 'bar': no matching overloaded function found  
error C2782: 'void bar(foo<T>, foo<T>)': template parameter 'T' is ambiguous
error C2784: 'void bar(foo<T>, foo<T>)': could not deduce template argument for 'foo<T>' from 'foo<float>'

最佳答案

给定调用函数的代码

foo<double> a;
foo<float> b;

bar(a, b);

编译器无法确定T 是否存在。需要是 doublefloat .两者都是同样好的候选人。因此,它无法解析类型。

您可以使用以下方法之一解决问题:

  1. 制作T在调用中显式。

    bar<double>(a, b);
  2. 更改函数声明以便有两种类型,第一种类型从第一个参数推导出来,第二种类型从第一个参数推导出来,除非明确指定。

    template<typename T1, typename T2 = T1>
    void bar(foo<T1> a, foo<T2> b)
    {
    //
    }

    然后,你可以使用

    bar(a, b);

    如果你想保留类型为 foo<float> 的第二个参数,你必须明确这一点。

    bar<double, float>(a, b);

关于c++ - 与模板函数一起使用时没有模板结构的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56228646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com