2016-08-21 2 views
0

У меня есть следующий C++ код:C++ недействителен преобразование Int * до 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'
инициализирующий аргумент 1 из «Int F (int, int) '. Что это значит ?

Благодаря

+1

'a' - это' int * ', но функция ожидает' int'. – tkausl

+3

Переменные 'a' и' b' имеют разные и несовместимые типы. –

+1

Что вы ожидаете от типа 'a', и что вы ожидаете от' b'? – JVApen

ответ

3

Вы должны разыменованием a в вызове f. Это связано с тем, что a является указателем на a int, а b - голый int. Выделение указателя на int возвращает int. Это приводит к тому, что функция f вызывается с двумя ints.

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

В вашей функции выше, первый параметр ожидает целочисленный аргумент, а не адрес, указывающий на целое значение. Поэтому вам нужно убедиться, что типы данных ваших параметров FUNCTION PARAMETERS должны соответствовать типам данных ваших FUNCTION ARGUMENTS. В противном случае такие ошибки компиляции всегда будут отображаться во время компиляции.

Так что в вашем случае, есть следующие пути решения этой проблемы:

  1. изменить вашу функцию параметра Int х в Int * х или
  2. изменить свой п (а, б) f (* а , b), так что значение a отправляется не адрес. Или
  3. объявите как простое целое число, как вы сделали для b. Затем, вызывая функцию f, отправляйте адрес переменной a. Убедитесь, что для этой опции параметр функции int x должен быть изменен на int * x