使用类型转换构造函数的参数的问题

时间:2013-06-25 14:14:05

标签: c++ constructor

#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))这样的参数来调用构造函数会发生什么呢?

3 个答案:

答案 0 :(得分:4)

Foo f(int(x));

它不是类型转换,它是一个函数声明 - 函数f,它接受​​int x并返回Foo

语法允许在声明中的标识符周围有一组(理论上无限制的)括号。这跟你写的一样

Foo f(int x);

Foo f( int (((x))) );

正如您已经想到的那样,您不需要投射,因为doubleint之间的转换是隐含的。但如果你真的想要,你可以说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适用于您的具体案例。从那开始,如果你还有问题,请告诉我们。