Вопрос

#include<iostream>
class name
{
public:
    int a;
    name():a(0){};
};
void add(name * pname)
{
    pname = NULL;
}
int main()
{
    name varName();
    name * pName = new name();
    add(pName);
    add(&varName);//error C2664: 'add' : cannot convert parameter 1 from 'name __cdecl *)(void)' to 'name *'
}
Это было полезно?

Решение

Я думаю, что стоит рассказать вам о подобной проблеме, что также вызывает проблемы:

struct foo { };
struct bar { bar(foo f); };

int main() {
  // does *not* create a bar object initialized by a default constructed 
  // foo object.
  bar b(foo());
}

Что B действительно это функция, которая возвращает bar И принимает в качестве первого аргумента указатель на функцию, которая возвращает FOO без аргументов. Это так же, как:

bar b(foo(*)());

Если вы хотите создать бэрный объект, инициализированный по умолчанию, построенный FOO, поставьте скобки вокруг аргумента. Это делает его не похоже на декларацию функции, и компилятор будет интерпретировать его, как вы хотите:

bar b((foo()));

Существуют также неочевидные случаи, когда ошибка компилятора должна быть увеличена. GCC делает это неправильно, но Comeau снова получает это прямо. Рассмотрим следующий фрагмент

struct foo {
  static bool const value = false;
};

int main() {
  int v(int(foo::value));
}

Вы, вероятно, ожидаете, что это берет статическую константу и отбрасывает его int, инициализация v переменная к 0? Нет, он не будет в соответствии со стандартом, поскольку инициализатор может быть интерпретирован как декларация, согласно чистому синтаксическому анализу, как следующие шоу

struct foo {
  static int value;
};

// valid, parentheses are redundant! Defines `foo::value`.
int (foo::value); 

Всякий раз, когда инициализатор может быть интерпретирован как декларация, в такой ситуации целую целую декларацию объявит функцию. Итак, линия в main объявляет функцию, как следующее, пропуская избыточные и бессмысленные скобки

int v(int foo::value);

И это приведет к ошибке компилятора при анализе объявления функции, поскольку имя параметра функции не может быть квалифицировано.

Другие советы

Ошибка находится на первой строке основной функции:

name varName();

Ты нет Создание экземпляра класса название С конструктором по умолчанию вы фактически объявляете новую функцию, называемую варнам, без параметров, который возвращает название экземпляр.

Вы должны вместо этого писать:

name varName;

Также стоит отметить, что ваша функция ADD () не имеет никаких длительных эффектов - все это делает, присваивает значение pname, которое является копией указателя, который вы передаете в него. Если вы хотите на самом деле иметь это присвоение, вам нужно будет пройти указатель по ссылке как «имя * & pname».

name varName();

интерпретируется как локальная декларация функций. Чтобы вызвать конструктор по умолчанию, использовать

name varName;

вместо. Самый доверенный, да.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top