5
#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了 in Foo f(int(x))。我的意思是,如果我这样写:

     Foo f(x);

代码编译正确,输出为 3。

那么如果我们键入像Foo f(int(x))这样的参数来调用构造函数会发生什么?

4

3 回答 3

4

Foo f(int(x));

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

该语法允许在声明中的标识符周围使用一组(理论上无限的)括号。就像你写的一样

Foo f(int x);

或者

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

正如您已经知道的那样,您不需要强制转换,因为 adouble和 and之间的转换int是隐式的。但如果你真的想要,你可以说static_cast<int>(x),或者

Foo f((int (x)));
//    ^       ^

这使它成为表达式而不是声明。

于 2013-06-25T14:21:38.160 回答
1

我没有收到错误,我收到警告

C4930: 'Foo f(int)': prototyped function not called (was a variable definition intended?)

试试这个:

Foo1 f1(int(pi));

并按照评论中的建议查找最令人烦恼的解析。您已经声明了一个函数,而不是调用了构造函数。

于 2013-06-25T14:20:43.420 回答
0

int(x)不是你正确投射的方式。(int)(x)或者(int)x将适用于您的特定情况,我相信。从那开始,然后让我们知道您是否仍有问题。

于 2013-06-25T14:26:01.797 回答