1

私の目標は、さまざまなタイプのノードでリンクされたリストを作成することです。このために、次のようにノード クラス テンプレートを作成しました。

template <class T>
class N_Node
{
public:
    N_Node(T e, N_Node *p = nullptr ,N_Node *n = nullptr);
    void set_previous(N_Node<T> *p);
    void set_next(N_Node<T> *n);
    N_Node get_previous();
    N_Node get_next();

    T element;
    N_Node *prev;
    N_Node *next;
};

ここで、main.cpp で次の操作を実行しようとすると、型の引数が型N_Node<int>*のパラメーターと互換性がないというエラーが表示されますN_Node<char>*。それで、以前に設定されたノードが現在のノードとは異なるタイプになる可能性があることを指定する方法があるかどうか疑問に思っていましたか?

N_Node<int> n1(5);
N_Node<char> n3('g');
n3.set_previous(&n1);
4

1 に答える 1

1

絶対にN_Node_Base、メンバーを省略したクラスを作成しelement、それを継承してN_Node<T>. ほとんどの C++ 標準ライブラリの実装では、テンプレートのオーバーヘッドを減らすためにこれを行っています。

もちろん、これを行うと、各要素の型がわからないため、リストを走査して要素にアクセスすることができなくなります。T例えば ​​を使用するために最小限のインターフェースを越えてタイプ消去したいかもしれませんがboost::any、なぜこれをしたいのかについてもっと言わなければならないでしょう。

于 2012-06-10T14:04:53.993 に答える