【问题标题】:trying to pass pointer to int to a function that takes pointer to long, how to do this试图将指向 int 的指针传递给一个需要指向 long 的函数,如何做到这一点
【发布时间】:2013-05-01 22:12:28
【问题描述】:

这里是函数

template <typename T> T sum(T *x, T *y)
{
    T z(0);
    z=*x+*y;
    return z;
}

我现在正在学习模板。

这是我在主子程序中尝试做的事情:

int i(1), j(2);
long p(12), q(3);

std::cout<<sum(&i,&j)<<" is the output\n";
std::cout<<sum(&((long)i),&q)<<" is the second output\n";

位和(&((long)i),&q) 不起作用。无论如何,我可以使用变量 i 调用函数,而不必将其值放入另一个 long 类型的变量中,而不是使用这个其他变量调用函数 sum?我可以理解我编写模板的方式,它会生成两个参数类型相同的函数。我想让它生成具有两种不同类型的参数的函数一点也不难,我想这是另一种选择。

【问题讨论】:

  • 为什么你的sum 函数需要指针?为什么不只是const T&amp;
  • 我没有想到这一点,我只是想好了让我们使用指针并使第一个示例变得困难。这里是 2315,可能我不应该这样做。
  • 好的,所以我很困惑为什么要将指向整数的指针(或引用)传递给函数 - 它只会毫无理由地让一切变得更加复杂。这是因为实际上,您的类型是别的东西,作为指针/引用传递是否有意义? [也就是说,在某种程度上,这是一个 XY 问题]
  • 我改为使用左值引用。即使是现在,我也无法将 (long)i 作为参数,即使我正在投射它。
  • @quantum231 2315?未来 302 年 C++ 还在积极使用? 该死!!! 量子计算是否广泛可用(因此获得了你的绰号)?卡戴珊还是真人秀明星吗?

标签: c++ templates visual-c++ pointers


【解决方案1】:

您不应该在 sum 函数中使用指针。在这里使用它们是没有意义的。您可以使用 const 引用,因为不会在函数体内修改参数:

template <typename T> 
T sum(const T &x, const T &y)
{
    T z(0);
    z=x + y;
    return z;
}

当您使用 2 个不同类型的参数调用函数时,编译器将无法推断模板参数类型。因此,您需要明确指出您想要哪一个:

std::cout << sum<long>(i, q) << std::endl;

您也可以强制转换参数之一,在这种情况下,编译器将能够推断出类型:

std::cout << sum(static_cast<long>(i), q) << std::endl;

【讨论】:

  • +1 您也可以保留显式强制转换,如下所示:link
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
相关资源
最近更新 更多