这是'type variableofType()'函数还是对象?

时间:2009-01-07 12:18:23

标签: c++ function pointers

#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 *'
}

4 个答案:

答案 0 :(得分:22)

错误发生在主要功能的第一行:

name varName();

使用默认构造函数创建类 name 的实例,您实际上声明了一个名为 varName 的新函数,没有参数,返回名称实例。

你应该写:

name varName;

答案 1 :(得分:8)

我认为值得告诉你一个类似的问题,这也会造成麻烦:

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对象,请在参数周围加上括号。这使得它看起来不再像函数声明,编译器会像你想要的那样解释它:

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

这将在解析函数声明时导致编译器错误,因为函数参数名称可能不合格。

答案 2 :(得分:1)

值得注意的是,你的add()函数没有任何持久效果 - 它所做的就是为pname赋值,这是你传入它的指针的副本。如果你想要实际拥有该任务,你需要通过引用将指针作为“name *&amp; pname”传递。

答案 3 :(得分:0)

name varName();

被解释为本地函数声明。要调用默认构造函数,请使用

name varName;

代替。最令人烦恼,是的。