作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
尝试编译:
class AnonymousClass
{
public:
AnonymousClass(int x)
{
}
};
int main()
{
int x;
AnonymousClass(x);
return 0;
}
从 MSVC 生成错误:
foo.cpp(13) : error C2371: 'x' : redefinition; different basic types
foo.cpp(12) : see declaration of 'x'
foo.cpp(13) : error C2512: 'AnonymousClass' : no appropriate default constructor available
g++ 的错误信息类似:
foo.cpp: In function ‘int main()’:
foo.cpp:13: error: conflicting declaration ‘AnonymousClass x’
foo.cpp:12: error: ‘x’ has a previous declaration as ‘int x’
foo.cpp:12: warning: unused variable ‘x’
通过为 AnonymousClass
对象指定一个显式名称很容易解决这个问题,但是这里发生了什么,为什么?我认为这是更多的声明语法怪异(如 comp.lang.C++ 常见问题解答的 Q10.2 和 Q10.21 中描述的情况),但我对此并不熟悉。
最佳答案
AnonymousClass(x);
它定义了一个 AnonymousClass
类型的变量 x
。这就是您收到重定义错误的原因,因为 x
已声明为 int
。
括号多余。您可以添加更多大括号,例如:
AnonymousClass(x);
AnonymousClass((x));
AnonymousClass(((x)));
AnonymousClass((((x))));
//and so on
它们都与:
AnonymousClass x;
演示:http://www.ideone.com/QnRKH
您可以使用语法 A(x)
来创建匿名对象,尤其是在调用函数时:
int x = 10;
f(A(x)); //1 - () is needed
f(A((((x))))); //2 - extra () are superfluous
1
和 2
都调用函数 f
并传递 A
类型的对象:
但是,额外括号在 2
行仍然是多余的。
关于c++ - 这个 AnonymousClass(variable) 声明中到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6341951/
尝试编译: class AnonymousClass { public: AnonymousClass(int x) { } }; int main() { int x
我是一名优秀的程序员,十分优秀!