#include <iostream>
struct Foo
{
Foo(int d) : x(d) {}
int x;
};
int main()
{
double x = 3.14;
Foo f( int(x) );
std::cout << f.x << std::endl;
return 0;
}
编译此代码时出现以下错误:
[错误]请求'f'中的成员'x',这是非类型'Foo(int)'
假设我在int main
int
删除Foo f(int(x))
中的 Foo f(x);
。
我的意思是如果我这样写:
{{1}}
代码编译正确并输出为3。
那么如果我们输入像 Foo f(int(x))这样的参数来调用构造函数会发生什么呢?
答案 0 :(得分:4)
Foo f(int(x));
它不是类型转换,它是一个函数声明 - 函数f
,它接受int
x
并返回Foo
。
语法允许在声明中的标识符周围有一组(理论上无限制的)括号。这跟你写的一样
Foo f(int x);
或
Foo f( int (((x))) );
正如您已经想到的那样,您不需要投射,因为double
和int
之间的转换是隐含的。但如果你真的想要,你可以说static_cast<int>(x)
或
Foo f((int (x)));
// ^ ^
使它成为表达式而不是声明。
答案 1 :(得分:1)
我没有收到错误,我收到警告
C4930: 'Foo f(int)': prototyped function not called (was a variable definition intended?)
请改为尝试:
Foo1 f1(int(pi));
并按照评论中的建议查找最令人烦恼的解析。您已声明了一个函数,而不是调用构造函数。
答案 2 :(得分:0)
int(x)
不是你正确施展的方式。我相信,(int)(x)
或(int)x
适用于您的具体案例。从那开始,如果你还有问题,请告诉我们。