2017-09-06 5 views
0
template <typename T> 
class linked; 

template <typename T> 
class node { 
    ... 
    friend class linked<T>; 
}; 

template <typename T> 
class linked { 
    ... 
}; 

リンクされたクラスをノードのフレンドリクラスと宣言するように前方宣言しましたが、今度は別の.hおよび.cppファイルを作成します。それぞれのクラス。どのように私はそれらの前方宣言を行います。フレンドリーなクラスを使用するための.hファイルの前方宣言

+3

これらのテンプレートクラスの.cppファイルを作成するにはポイントがありません。 [必要なインスタンス化を明示的にインスタンス化しない限り、ヘッダーに実装する*必須* *](https://stackoverflow.com/q/495021/501250)それらをインスタンス化するためにテンプレートクラスメンバーの定義を知る必要があります。 – cdhowie

+0

私があなただったら、 'node'を構造体として宣言し、そのメンバーをすべてpublicにします。あなたは本当に便利なオブジェクトなので、実際にはアクセス制御は必要ありません。 – NathanOliver

+0

@cdhowie私は別のコードを持っていますが、これは単純化されたバージョンです。そこにはそれぞれのクラスごとに異なるcppファイルを作成する必要があります。前方宣言またはそれに似たものを実装する方法 –

答えて

0

テンプレートの宣言全体が.hファイルであることを考慮する必要があります。

あなたがそれらを分離する必要がある場合は、あなた可能性:

linked.h:

template <typename T> 
class linked; 
#include "linked_implementation.tpp" 

linked_implementation.tpp:コメント

+0

また、 'linked_implementation.cpp'がコンパイルするファイルとしてプロジェクトに追加されていないことを確認する必要があると述べるべきです。 – NathanOliver

+0

@ NathanOliverには、不要な作業をする以外に 'linked_implementation.cpp'をコンパイルするのに欠点がありますか? – Kevin

+0

@ NathanOliverが言及した理由のために、私は 'cpp'拡張子を使用しないでください。いくつかのIDEは自動的にすべての 'cpp'ファイルをビルドしますが、この場合は中断します。ほとんどの人はクラステンプレートの実装に 'tpp'や' hpp'を使います。 – 0x5453

1

node.hppに応じ

#ifndef LINKED_IMPLEMENTATION_TPP 
#define LINKED_IMPLEMENTATION_TPP 

template <typename T> 
class node { 
    ... 
    friend class linked<T>; 
}; 

template <typename T> 
class linked { 
    ... 
}; 

#endif 

編集

#pragma once 

template <typename T> class linked; 
template <typename T> class node { 
... 
friend class linked<T>; 
}; 

linked.hpp

#pragma once 
#include "node.hpp" // just because I guess you will use it in linked implementation 
template <typename T> class linked { 
... 
}; 

ですから含まlinked.hppなしで使用ノードを維持することができます。あなたはそれを秘密のヘッダーにしておくこともでき、ユーザーには出荷されません。しかし、リンクされている場合、リンクされたクラスを使用したいコードはlinked.hppをインクルードするだけです。

EDITオプション node.hppとして

#pragma once 

template <typename T> class node { 
... 
class linked; 
friend class linked<T>; 
}; 

linked.hpp

#pragma once 
#include "node.hpp" 
template <typename T> class node<T>::linked { 
... 
}; 
関連する問題