重複の可能性:
C ++テンプレート、リンクエラー
2つのリンクエラーがあり、コードの何が問題になっているのか、どのように修正するのかわかりません。
main.obj:-1:エラー:LNK2019:未解決の外部シンボル "public:__thiscall A :: A(void)"(?? 0?$ A @ VB @@@@ QAE @ XZ)関数 "public:__thiscallで参照B :: B(void) "(?? 0B @@ QAE @ XZ)
と
main.obj:-1:エラー:LNK2019:未解決の外部シンボル "public:void __thiscall A :: exec(void(__thiscall B :: *)(void))"(?exec @?$ A @ VB @@@@ QAEXP8B @@ AEXXZ @ Z)関数 "public:void __thiscall B :: run(void)"(?run @ B @@ QAEXXZ)で参照されます
コードを少し説明する:このクラスは、派生クラスから関数を実行する必要があります。関数execは、派生クラスパラメーターの関数を使用して派生クラスから呼び出されます。この関数の署名はvoid function();
//header.h
#ifndef HEADER_H
#define HEADER_H
template <class T>
class A
{
public:
typedef void (T::*ExtFunc)();
A();
void funcA();
void exec(ExtFunc func);
};
#endif // HEADER_H
//header.cpp
#include "header.h"
template<typename T>
A<T>::A() { }
template<typename T>
void A<T>::funcA()
{
cout << "testA\n";
}
template<typename T>
void A<T>::exec(ExtFunc func)
{
(T().*func)();
}
私はmain.cpp
Aクラスからクラスを派生させ、派生したクラスをテンプレートパラメータとして渡します。次に、関数exec
を介してrun()
関数を実行します。//main.cpp
#include <iostream>
#include "header.h"
using namespace std;
class B : public A<B>
{
public:
B() { }
void run()
{
exec(&B::funcB);
}
void funcB()
{
cout << "testB\n";
}
};
int main()
{
B ob;
ob.run();
return 0;
}
誰かが何が起こっているのか教えてもらえますか?...