0

重複の可能性:
テンプレートを使用すると、「未解決の外部シンボル」エラーが発生するのはなぜですか?

テンプレートを使用して汎用キューを実装しようとしています。

ヘッダーに次のコードがあります。

template<class Item>
class Queue{
protected:
    struct linked_list;
    int size;
public:
    Queue();
    Queue(Item T);
};

私はQueue.cppを持っています:

template<class Item>
Queue<Item>::Queue()
{

}
template<class Item>
Queue<Item>::Queue(Item T)
{

}

しかし、コンパイルするたびに、外部が未解決であるためにリンカーエラーが発生します。

VS2012を2回再インストールしました(リンカーが壊れていると思います)が、問題が引き続き発生します。

テンプレートを操作するときに関数の実装が別のファイルにあることに問題があることを読みましたが、実装をヘッダーに配置する以外の解決策は見当たりませんでした。

これを行うためのよりエレガントな方法はありますか?

4

2 に答える 2

2

テンプレートはサポートしていませんa definition is provided elsewhere and creates a reference (for the linker to resolve) to that definition

を使用する必要がありthe inclusion modelます。すべてのQueue.cpp定義をQueue.hファイルに入れます。またはQueue.hの下部にあります

#include "Queue.cpp"
于 2012-12-22T13:04:23.470 に答える
0

テンプレート宣言は、ソース コード全体に含める必要があります。それらを分割したい場合、私が使用することを好む1つの方法は次のとおりです。

queue.h の下部:

#define QUEUE_H_IMPL
#include "queue_impl.h"

および queue_impl.h で

//include guard of your choice, eg:
#pragma once

#ifndef QUEUE_H_IMPL
#error Do not include queue_impl.h directly. Include queue.h instead.
#endif

//optional (beacuse I dont like keeping superfluous macro defs)
#undef QUEUE_H_IMPL

//code which was in queue.cpp goes here

実際に私がそれを見た後、あなたが#undef QUEUE_H_IMPL.

于 2012-12-22T13:10:24.223 に答える