6

这可能是一个非常愚蠢的问题,但我什至不知道我应该写什么来寻找答案。我什至不确定我给的标题是否正确。

如果我有这样的构造函数:

CError(const std::string& msg) { showMessage(msg) }

我想这样称呼它......

CError("some message");

...一切正常,但是当在某个变量中指定字符串时,我收到一个错误“类 CError 的默认构造函数不存在”:

std::string str = "some message";
CError(str);

当我这样写时,它可以工作:

std::string str = "some message";
CError err(str);

但我只是不需要这个err对象。

谁能解释我为什么不能只调用构造函数本身?

提前感谢您的答案。

4

2 回答 2

8

该行CError(str);被解析为CError str;,它定义了一个新变量str。我的编译器以不同的方式失败,这使得问题更加明显:redefinition of 'str' with a different type.

解决此问题的一个简单方法是强制转换对象:

(void)CError(str);

然而,迫切的问题是:为什么要这样做?如果您不打算以任何方式使用构造的对象,为什么不简单地将其设为静态成员函数,甚至只是一个普通的旧自由函数?

于 2012-11-02T08:52:59.400 回答
4

该语句CError(str);被解读为定义str类型的对象CError;它等效于CError str;但带有str括号的名称。

要解决此问题,您也可以将类型名称括起来:(CError)(str);. 这会强制将语句读取为函数转换表达式;你可以等效地写(CError) str;甚至static_cast<CError>(str);.

在 C++11 中,您可以使用通用初始化语法来编写CError{str};.

于 2012-11-02T08:57:49.070 回答