1. ホーム
  2. c++

[解決済み] 名前空間stdでテンプレートクラスをフォワード宣言するには?

2022-06-30 16:21:38

質問

#ifndef __TEST__
#define __TEST__

namespace std
{
    template<typename T>
    class list;
}

template<typename T>
void Pop(std::list<T> * l)
{
    while(!l->empty())
        l->pop();
}

#endif

で、その関数をmainで使用しました。エラーが出ます。もちろん、私は、より多くのテンプレート・パラメータが std::list (allocatorだと思う)。しかし、それは重要な点ではありません。テンプレートクラスの完全なテンプレート宣言を知っていなければ、それを前方宣言することはできないのでしょうか?

EDIT:以前はポインタを使用していませんでした - 参照でした。ポインターで試してみます。

どのように解決するのですか?

問題は、テンプレートクラスを前方宣言できないことではありません。たしかに、テンプレートのパラメータをすべて知っておく必要はありますが とそのデフォルトである を正しく宣言できるようにする必要があります。

namespace std {
  template<class T, class Allocator = std::allocator<T>>
  class list;
}

しかし,このような前方宣言をするにも namespace std は標準では明示的に禁止されています。 のみ に入れることが許されているのは std はテンプレート 特殊化 であり、一般的に std::less のような、ユーザー定義の型に関するものです。必要であれば、他の誰かが関連するテキストを引用することができます。

ただ #include <list> にして、気にしないようにしましょう。

ああ、ちなみに、ダブルアンダースコアを含む名前は、実装で使用するために予約されているので、次のようなものを使用する必要があります。 TEST_H の代わりに __TEST__ . 警告やエラーは発生しませんが、プログラムが実装で定義された識別子と衝突した場合、コンパイルや実行が正しく行われる保証はありません:それは 不正確な . また、アンダースコアで始まり、大文字で終わる名前なども禁止されています。一般的に、どんな魔法を扱っているかわからない限り、アンダースコアで物事を始めるのはやめましょう。