Это функция или объект «VariableofType ()»
Вопрос
#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;
вместо. Самый доверенный, да.