使用指针的模板功能

时间:2018-01-24 20:57:09

标签: c++ templates pointers

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

#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;
}

2 个答案:

答案 0 :(得分:3)

&y的类型为float*,其中7.9的类型为double。编译器可以通过将Tfloat匹配来推导float*T* Value,或者可以通过将double与{{1}匹配来推断double }。要使模板参数推断成功,它必须是明确的。试试这个:

T NewValue

通过此更改,float y = 5.1f; ChangeValue(&y, 7.9f); 被推断为T

答案 1 :(得分:3)

使用时:

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有效。