私のコードをコンパイルしようとすると、リンカーは未定義の参照エラーを吐き出します- 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::Statement
と、コード サンプルは正常にコンパイルされます。インターフェイスを使用できないというかなり壊滅的な問題を引き起こすことなく、このエラーを解決するにはどうすればよいですか?