Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动使用隐式构造函数(但不正确) 我正在研究一些代码(OpenJDK 8 VM的一个变体,如果你想知道),它试图用C++代码例示一个C++类,叫做“代码>解释程序宏汇编程序< /C>”: // interpreter.hpp CodeletMark(InterpreterMacroAssembler*& masm, const char* description, Bytecodes::Code bytecode = Bytecodes::_illegal): _clet((InterpreterCodelet*)AbstractInterpreter::code()->request(codelet_size())), _cb(_clet->code_begin(), _clet->code_size()) { // request all space (add some slack for Codelet data) assert (_clet != NULL, "we checked not enough space already"); // initialize Codelet attributes _clet->initialize(description, bytecode); // create assembler for code generation masm = new InterpreterMacroAssembler(&_cb); _masm = &masm; } // macroAssembler_x86.hpp MacroAssembler(CodeBuffer* code) : Assembler(code) {}_C++_Visual C++ - Fatal编程技术网

自动使用隐式构造函数(但不正确) 我正在研究一些代码(OpenJDK 8 VM的一个变体,如果你想知道),它试图用C++代码例示一个C++类,叫做“代码>解释程序宏汇编程序< /C>”: // interpreter.hpp CodeletMark(InterpreterMacroAssembler*& masm, const char* description, Bytecodes::Code bytecode = Bytecodes::_illegal): _clet((InterpreterCodelet*)AbstractInterpreter::code()->request(codelet_size())), _cb(_clet->code_begin(), _clet->code_size()) { // request all space (add some slack for Codelet data) assert (_clet != NULL, "we checked not enough space already"); // initialize Codelet attributes _clet->initialize(description, bytecode); // create assembler for code generation masm = new InterpreterMacroAssembler(&_cb); _masm = &masm; } // macroAssembler_x86.hpp MacroAssembler(CodeBuffer* code) : Assembler(code) {}

自动使用隐式构造函数(但不正确) 我正在研究一些代码(OpenJDK 8 VM的一个变体,如果你想知道),它试图用C++代码例示一个C++类,叫做“代码>解释程序宏汇编程序< /C>”: // interpreter.hpp CodeletMark(InterpreterMacroAssembler*& masm, const char* description, Bytecodes::Code bytecode = Bytecodes::_illegal): _clet((InterpreterCodelet*)AbstractInterpreter::code()->request(codelet_size())), _cb(_clet->code_begin(), _clet->code_size()) { // request all space (add some slack for Codelet data) assert (_clet != NULL, "we checked not enough space already"); // initialize Codelet attributes _clet->initialize(description, bytecode); // create assembler for code generation masm = new InterpreterMacroAssembler(&_cb); _masm = &masm; } // macroAssembler_x86.hpp MacroAssembler(CodeBuffer* code) : Assembler(code) {},c++,visual-c++,C++,Visual C++,问题是,编译器发出了一个错误,因为它认为我试图调用隐式创建的复制构造函数(签名为ImplicitMacroAssembler(const ImplicitMacroAssembler&)),并抛出了一个类型不匹配错误,因为我没有传递相同类型的对象。我已经验证了(通过使用一个放置合理的#pragma消息)编译器正在看到正确的构造函数,但由于某种原因没有使用它。为什么C++编译器会喜欢在显式写的(但不是显式< /代码>中的C++关键字意义下)隐式生成的复制构造函数? 更改上面的代码以将新的解释器宏汇

问题是,编译器发出了一个错误,因为它认为我试图调用隐式创建的复制构造函数(签名为
ImplicitMacroAssembler(const ImplicitMacroAssembler&)
),并抛出了一个类型不匹配错误,因为我没有传递相同类型的对象。我已经验证了(通过使用一个放置合理的
#pragma消息
)编译器正在看到正确的构造函数,但由于某种原因没有使用它。为什么C++编译器会喜欢在显式写的(但不是<代码>显式< /代码>中的C++关键字意义下)隐式生成的复制构造函数? 更改上面的代码以将新的
解释器宏汇编程序
实例存储在局部变量中(我称之为
masm2
),然后以与上面相同的方式将
masm2
放入
masm
\u masm
变量中,不会改变任何事情


我正在使用Microsoft Visual Studio 2015发布预览版,版本为19.00.22816,如果有帮助的话。

根据您对问题的文字描述:

void foo (InterpreterMacroAssember*& masm) {
    //... do something with masm
}

//...
CodeBuffer _cb;
foo(new InterpreterMacroAssembler(&_cb));
这将失败,因为您正在引用临时指针

你误解了错误代码。从您引用的文档页面:

'function':无法将参数编号从“type1”转换为“type2”

如果创建了一个类的实例,并尝试对标记为explicit关键字的构造函数进行隐式转换,则可能会发生此参数转换问题。有关显式转换的更多信息,请参阅转换。
如果将临时对象传递给以对象引用为参数的函数,则该引用必须是常量引用。

你可能碰到了我在第二段中强调的问题

若要修复,请将参数设为一个
const
参考。由于它是指针参数,
const
关键字需要位于引用和指针类型指示器之间

void foo (InterpreterMacroAssember* const & masm) {  //...
但是,首先引用参考文献有点愚蠢。除非Java接口需要它,否则更直接的方法是将函数更改为只接受指针参数

void foo (InterpreterMacroAssember* masm) {  //...

如果你能提供一个完整的例子来说明这个问题,那就更有用了。上面的代码不会编译,因为你不允许声明一个未初始化的引用变量。我认为“参数”是指函数参数,但奇怪的是,为什么您的示例不仅提供了正确的说明,而没有提供令人困惑和误导的说明。包括确切的错误消息Too类
解释器宏汇编程序
是否有带签名的构造函数
解释器宏汇编程序(CodeBuffer*)
从调用它的代码中可见吗?