自动使用隐式构造函数(但不正确) 我正在研究一些代码(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*)
从调用它的代码中可见吗?