2016-08-21 95 views
0

我有以下C++代码:C++无效转换到int

#include <iostream> 

using namespace std; 
template<class T> 
T f(T x, T y) 
{ 
    return x+y; 
} 
int f(int x, int y) 
{ 
    return x-y; 
} 
int main() 
{ 
    int *a=new int(3), b(23); 
    cout<<f(a,b); 
    return 0; 
} 

我得到这些错误:从 '诠释*' 到 'INT'
初始化“诠释的F参数1无效的转换(int,int)'。这是什么意思 ?

感谢

+1

'a'是一个'int *',但函数需要一个'int'。 – tkausl

+3

变量'a'和'b'具有不同的和不兼容的类型。 –

+1

你认为'a'的类型是什么,你对'b'有什么期望? – JVApen

回答

3

您需要取消引用a在您的来电f。这是因为a是指向和int,而b是空的int。取消引用指向int的指针会返回int。这导致函数f被调用两个整数。

cout<<f(*a,b); 
+1

哦,模板函数不能带指针。 –

+0

@ Cheersandhth.-Alf模板函数可以接受指针(虽然它可能会导致编译错误以添加两个指针)。但是,这里模板函数的两个参数是相同的类型,并且当提供两种不同类型('int *'和'int')的参数时,模板推演失败。 – fefe

+0

@fefe:模板函数不能带指针,因为你不能添加指针。 –

1

请告诉我们您想实现的目标?

您需要使用*运算符从'a'指针获取值。不管这个代码编译没有错误的情况

f(*a,b) //this invocation should work. 

,这是丑陋的

1
int f(int x, int y) 
{ 
    return x-y; 
} 

在你上面的函数,第一个参数期待一个整数参数,而不是指向一个整数值的地址。因此,您需要确保功能参数的数据类型必须与您的功能自变量的数据类型相匹配。否则,编译时总会弹出这样的编译错误。

所以你的情况,也有这个问题如下解决方案:

  1. 改变你的函数参数整数X为int * x或
  2. 改变你的F(A,B)到f(*一,b)使得a的值被发送而不是地址或者
  3. 将a声明为一个简单的整数,就像你对b所做的那样。然后在调用f函数时,发送变量a的地址。确保这个选项,函数参数int x应该改为int * x