我以前从未见过 C++ 的这种特殊之处,这让我有些困惑。
我有以下类(class):
class KeyValuesParser
{
public:
explicit KeyValuesParser(const QByteArray &input);
QJsonDocument toJsonDocument(QString* errorString = nullptr);
// ...
};
我正尝试在 Qt 单元测试中像这样使用它:
const char* testData = "...";
KeyValuesParser parser(QByteArray(testData));
QJsonDocument doc = parser.toJsonDocument();
这会产生以下编译错误:
Member reference base type 'KeyValuesParser(QByteArray)' is not a structure or union.
但是,如果我在堆栈上创建字节数组然后将其传入,而不是传入临时数组,则一切都可以正常编译:
const char* testData = "...";
QByteArray testByteArray(testData)
KeyValuesParser parser(testByteArray);
QJsonDocument doc = parser.toJsonDocument();
我认为这可能是一些需要 explicit
关键字(这就是我添加它的原因)的奇怪黑魔法,但这没有任何区别。谁能解释一下这是怎么回事?
编辑:我被提到另一个问题是重复的,我认为它几乎是重复的,但在这个问题上有一些最令人烦恼的解析混淆,我认为值得额外讨论。
最佳答案
注意。这是乔纳斯在我附近的回答的补充。
你想做的是将右值绑定(bind)到左值引用,这在 C++ 标准中是不允许的。在您的第二个示例中 - 您通过引用正确传递了左值,这就是它起作用的原因。
将右值引用绑定(bind)到左值引用是Visual C++的扩展,g++根本做不到,clang用-fms-extensions可以做到
关于c++ - 对象 "is not a structure or union"如果临时传递给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40905111/