Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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
C++ 复制std::函数的构造函数时发生链接器错误_C++_Visual Studio 2012 - Fatal编程技术网

C++ 复制std::函数的构造函数时发生链接器错误

C++ 复制std::函数的构造函数时发生链接器错误,c++,visual-studio-2012,C++,Visual Studio 2012,当试图编译我的代码时,链接器向std::function的复制构造函数抛出一个未定义的引用错误。我不明白这怎么可能。这是我创建的SSCCE #include <functional> #include <cassert> namespace Wide { namespace Codegen { class Statement { public: virtual ~Statement() {} }; class Expression

当试图编译我的代码时,链接器向std::function的复制构造函数抛出一个未定义的引用错误。我不明白这怎么可能。这是我创建的SSCCE

#include <functional>
#include <cassert>

namespace Wide {
    namespace Codegen {
        class Statement { public: virtual ~Statement() {} };
        class Expression : public Statement {};
        class IfStatement  : public Statement {};
        class Generator {
        public:
            virtual IfStatement* CreateIfStatement(Expression* expr, Statement* t, Statement* f) = 0;
            virtual IfStatement* CreateIfStatement(std::function<Expression*()>, Statement*, Statement*) = 0;
        };
    }
    namespace LLVMCodegen {
        class Statement { public: virtual ~Statement() {} };
        struct Expression : Statement {};

        class IfStatement : public Statement, public Codegen::IfStatement {
        public:
            IfStatement(std::function<LLVMCodegen::Expression*()> cond, LLVMCodegen::Statement* tbr, LLVMCodegen::Statement* fbr) {}
        };
        Expression* AssertExpression(Wide::Codegen::Expression* e) {
            return dynamic_cast<Wide::LLVMCodegen::Expression*>(e);
        }
        Statement* AssertStatement(Wide::Codegen::Statement* e) {
            return dynamic_cast<Wide::LLVMCodegen::Statement*>(e);
        }
        class Generator : public Codegen::Generator {
        public:            
            IfStatement* CreateIfStatement(Codegen::Expression* expr, Codegen::Statement* t, Codegen::Statement* f) {
                return CreateIfStatement([=] { return expr; }, t, f);
            }
            IfStatement* CreateIfStatement(std::function<Codegen::Expression*()> cond, Codegen::Statement* tr, Codegen::Statement* fls) {
                return new IfStatement([=] { return AssertExpression(cond()); }, AssertStatement(tr), fls ? AssertStatement(fls) : nullptr);
            }
        };
    }
}

int main() {
    Wide::LLVMCodegen::Generator g;
}
尝试编译此示例会导致

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall std::function<class Wide::Codegen::Expression * __cdecl(void)>::function<class Wide::Codegen::Expression * __cdecl(void)>(class std::function<class Wide::Codegen::Expression * __cdecl(void)> &)" (??0?$function@$$A6APAVExpression@Codegen@Wide@@XZ@std@@QAE@AAV01@@Z) referenced in function "public: class Wide::Codegen::IfStatement * __thiscall Wide::LLVMCodegen::Generator::CreateIfStatement(class std::function<class Wide::Codegen::Expression * __cdecl(void)>,class Wide::Codegen::Statement *,class Wide::Codegen::Statement *)" (?CreateIfStatement@Generator@LLVMCodegen@Wide@@QAEPAVIfStatement@Codegen@3@V?$function@$$A6APAVExpression@Codegen@Wide@@XZ@std@@PAVStatement@53@1@Z)

如果从Wide::LLVMCodegen::语句中删除所有虚拟函数,那么代码示例将按其应该的方式编译。如何解决这个错误,而不引入无法使用接口的严重问题?

我发现,通过设置参数const,我可以避免这个错误。

可以很好地处理。是的,我猜这是一个编译器错误。在gcc和clang的两个版本中都可以正常工作。问题不是它是否是编译器错误,而是我将如何解决它试图链接到一个副本构造函数,该构造函数通过引用非常量来获取其参数。尝试在CreateIfStatement中生成cond const或其他内容,以强制它选择通过引用const获取的规范副本构造函数。