C++ 解决模板参数推导中的不明确调用

C++ 解决模板参数推导中的不明确调用,c++,templates,template-argument-deduction,C++,Templates,Template Argument Deduction,典型的函数模板签名: template<typename Iterator, typename T> T fn(Iterator first, Iterator last, T init) { T result; // ... return result; } 是明确的,并导致将T设置为Iterator::value\u type?选择 template<Iterator> typename iterator_traits<Iterator

典型的函数模板签名:

template<typename Iterator, typename T>
T fn(Iterator first, Iterator last, T init)
{
    T result;
    // ...
    return result;
}
是明确的,并导致将
T
设置为
Iterator::value\u type
?选择

template<Iterator>
typename iterator_traits<Iterator>::value_type fn(Iterator first, Iterator last, typename iterator_traits<Iterator>::value_type init)
{
    //...
}
模板
typename迭代器_traits::value_type fn(迭代器优先、迭代器最后、typename迭代器_traits::value_type init)
{
//...
}
导致来自g++/clang++的不明确调用错误

编辑:

我现在看到了我的错误,上面的代码与下面的@Lightness Races建议一起工作。感谢您的帮助。

作为:

0 is an int
0L is a long
您只需使用正确的参数调用该方法:

  • 直接使用正确的文字
作为:

  • 或者,您可以使用中间变量
作为:

  • 或者,您可以使用以下值:
作为:

作为:

您只需使用正确的参数调用该方法:

  • 直接使用正确的文字
作为:

  • 或者,您可以使用中间变量
作为:

  • 或者,您可以使用以下值:
作为:

作为:

您只需使用正确的参数调用该方法:

  • 直接使用正确的文字
作为:

  • 或者,您可以使用中间变量
作为:

  • 或者,您可以使用以下值:
作为:

作为:

您只需使用正确的参数调用该方法:

  • 直接使用正确的文字
作为:

  • 或者,您可以使用中间变量
作为:

  • 或者,您可以使用以下值:
作为:


为什么不干脆过一段长时间

fn(data.begin(), data.end(), 0L);
除此之外,您可能还可以这样做:

std::vector<long> data(1000,1);
fn(data.begin(), data.end(), 0);
#include <type_traits>

template<typename Iterator>
typename std::iterator_traits<Iterator>::value_type fn(
   Iterator first,
   Iterator last,
   typename std::iterator_traits<Iterator>::value_type init
);
#包括
模板
类型名称std::迭代器特征::值类型fn(
迭代器优先,
迭代器last,
typename std::迭代器\特征::值\类型init
);

不过,我真的不明白你有多大的溢出风险。

为什么不简单地通过一个长的测试呢

fn(data.begin(), data.end(), 0L);
除此之外,您可能还可以这样做:

std::vector<long> data(1000,1);
fn(data.begin(), data.end(), 0);
#include <type_traits>

template<typename Iterator>
typename std::iterator_traits<Iterator>::value_type fn(
   Iterator first,
   Iterator last,
   typename std::iterator_traits<Iterator>::value_type init
);
#包括
模板
类型名称std::迭代器特征::值类型fn(
迭代器优先,
迭代器last,
typename std::迭代器\特征::值\类型init
);

不过,我真的不明白你有多大的溢出风险。

为什么不简单地通过一个长的测试呢

fn(data.begin(), data.end(), 0L);
除此之外,您可能还可以这样做:

std::vector<long> data(1000,1);
fn(data.begin(), data.end(), 0);
#include <type_traits>

template<typename Iterator>
typename std::iterator_traits<Iterator>::value_type fn(
   Iterator first,
   Iterator last,
   typename std::iterator_traits<Iterator>::value_type init
);
#包括
模板
类型名称std::迭代器特征::值类型fn(
迭代器优先,
迭代器last,
typename std::迭代器\特征::值\类型init
);

不过,我真的不明白你有多大的溢出风险。

为什么不简单地通过一个长的测试呢

fn(data.begin(), data.end(), 0L);
除此之外,您可能还可以这样做:

std::vector<long> data(1000,1);
fn(data.begin(), data.end(), 0);
#include <type_traits>

template<typename Iterator>
typename std::iterator_traits<Iterator>::value_type fn(
   Iterator first,
   Iterator last,
   typename std::iterator_traits<Iterator>::value_type init
);
#包括
模板
类型名称std::迭代器特征::值类型fn(
迭代器优先,
迭代器last,
typename std::迭代器\特征::值\类型init
);


不过,我真的不知道你有多大的溢出风险。

@Jarod42:我建议使用更好的字体。对于溢出,请考虑使用'big'
int
@Jarod42:
fn
<,但是你不能摆脱它,这会导致溢出。@Lightness Races:是的,这是有效的(第二个建议)。我愚蠢地使用了
Iterator::value\u-type
而不是
Iterator\u-traits::value\u-type
,我应该在发帖前发现我的错误。谢谢@Jarod42:我建议使用更好的字体。对于溢出,请考虑使用'big'
int
std::acculate
。@Jarod42:我想你会增加
fn
内部溢出的风险,但你无法摆脱它,这将导致溢出。@Lightness Races:是的,这是有效的(第二个建议)。我愚蠢地使用了
Iterator::value\u-type
而不是
Iterator\u-traits::value\u-type
,我应该在发帖前发现我的错误。谢谢@Jarod42:我建议使用更好的字体。对于溢出,请考虑使用'big'
int
std::acculate
。@Jarod42:我想你会增加
fn
内部溢出的风险,但你无法摆脱它,这将导致溢出。@Lightness Races:是的,这是有效的(第二个建议)。我愚蠢地使用了
Iterator::value\u-type
而不是
Iterator\u-traits::value\u-type
,我应该在发帖前发现我的错误。谢谢@Jarod42:我建议使用更好的字体。对于溢出,请考虑使用'big'
int
std::acculate
。@Jarod42:我想你会增加
fn
内部溢出的风险,但你无法摆脱它,这将导致溢出。@Lightness Races:是的,这是有效的(第二个建议)。我愚蠢地使用了
Iterator::value\u-type
而不是
Iterator\u-traits::value\u-type
,我应该在发帖前发现我的错误。谢谢好的,但我想防止这种情况发生在我自己或其他人身上。对我来说,真正的问题是,既然定义了这个,我就不能专门制作一个合适的
fn
。第二个模板参数是完全多余的-作者希望它始终是一个
迭代器::value_type
,我想去掉它。好吧,但我想防止这种情况发生在我自己或其他人身上。对我来说,真正的问题是,既然定义了这个,我就不能专门制作一个合适的
fn
。第二个模板参数是完全多余的-作者希望它始终是一个
迭代器::value_type
,我想去掉它。好吧,但我想防止这种情况发生在我自己或其他人身上。对我来说,真正的问题是,既然定义了这个,我就不能专门制作一个合适的
fn
。第二个模板参数是完全多余的-作者希望它始终是一个
迭代器::value_type
,我想去掉它。好的