【问题标题】:Template Function using Pointers使用指针的模板函数
【发布时间】:2018-01-24 20:57:09
【问题描述】:

我在这里做一些根本错误的事情吗?我正在使用模板和指针,但我在这里遇到错误。

#include <iostream>
#include <string>

template <class T>
void ChangeValue(T*, T);

int main()
{
int x = 51;

ChangeValue(&x, 7);

std::cout << x;

float y = 5.1;

ChangeValue(&y, 7.9);

std::cout << y;
}

template <class T>
void ChangeValue(T* Value, T NewValue)
{
    *Value = NewValue;
}

【问题讨论】:

  • 您遇到了什么错误?如果不发布错误,这不是minimal reproducible example
  • 谢谢弗朗索瓦,看来这是我的误解。我的印象是花车和双打相似,但双打更大更精确。我将如何改进我的示例以避免此错误?一个简单的演员表就足够了吗?
  • 是的,需要 MCVE。但是,此外,将错误消息扔到网络搜索中也可以防止从一开始就提出多余的问题。
  • @Iloveasparagus 我已经从我的评论中做出了回答。它包含解决问题的可能更改。

标签: c++ templates pointers


【解决方案1】:

使用时:

float y = 5.1;
ChangeValue(&y, 7.9);

第一个参数的类型是float*,而第二个参数的类型是double。因此,编译器无法推断出T

修复它的一种方法是使用:

template <typename T1, typename T2 = T1>
void ChangeValue(T1* Value, T2 NewValue)
{
    *Value = NewValue;
}

这样,T2 是从 T1 推导出来的,除非用户明确覆盖它。

float y = 5.1;
ChangeValue<float, double>(&y, 7.9);

只要

    *Value = NewValue;

对给定的T1T2 有效。

【讨论】:

  • 将上一行改为float y = 5.1f;就目前而言,程序告诉编译器创建一个 double(5.1),然后将其缩小为浮动。 VC++ 给出警告,警告 C4305: 'initializing': truncation from 'double' to 'float'
【解决方案2】:

&amp;y 的类型为 float*,而 7.9 的类型为 double。编译器可以通过匹配float*T* Value 来推断Tfloat,或者它可以通过匹配doubleT NewValue 来推断double。为了使模板参数推导成功,它必须是明确的。试试这个:

float y = 5.1f;
ChangeValue(&y, 7.9f);

通过此更改,T 被推断为float

【讨论】:

  • 将上一行改为float y = 5.1f;就目前而言,程序告诉编译器创建一个 double(5.1),然后将其缩小为浮动。 VC++ 给出警告,警告 C4305: 'initializing': truncation from 'double' to 'float'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2015-04-26
  • 1970-01-01
相关资源
最近更新 更多