1

STLの派生クラスを書き込もうとしていset<>ますが、リンクエラーが発生しました。

ヘッダーファイルSet.h

#pragma once
#include <set>
using namespace std;

template <class Ty>
class Set : public set<Ty> {
public:
    Set(void);
    virtual ~Set(void);
};

補助ソースファイルSet.cpp

#include "Set.h"
template <class Ty>
Set<Ty>::Set(void) {}
template <class Ty>
Set<Ty>::~Set(void) {}  

メインプログラム:

#include <iostream>
#include "../myLibrary/Set.h"
#pragma comment(lib, "../x64/Debug/myLibrary.lib")

using namespace std;
int main() {
    Set<int> s;
    s.insert(1); s.insert(2); s.insert(3);
    for(Set<int>::const_iterator it = s.begin(); it!=s.end(); it++)
        wcout << *it << endl;
    return 0;
}

これは発生します

Set.obj : *warning* LNK4221:

_Entry_myLibrary_TEST.obj :error LNK2019: "public: virtual __cdecl Set<int>::~Set<int>(void)" (??1?$Set@H@@UEAA@XZ)

4

1 に答える 1

1

あなたの差し迫った問題は、テンプレート関数を Set.cpp に入れることです。テンプレート関数は、それらを使用するコードから見える必要があるため、別の .cpp ファイルではなく .h ファイルにある必要があります。

補助ソース ファイル Set.cpp:

#include "Set.h" 
template <class Ty> 
Set<Ty>::Set(void) {} 

template <class Ty> 
Set<Ty>::~Set(void) {} 

関数をヘッダーに入れます。関数が使用されている場所で見えるようにする必要があります。

あなたの質問ではないので、セットからの継承がおそらくあなたがしたいことではない理由を指摘するために、他の人に任せます。

于 2012-08-09T10:58:28.390 に答える