7

私はここでいくつかのポリシーベースの設計を行っており、名前を短くするために多くのテンプレート タイプを typedef する必要があります。
問題は、これらの型のいずれかへのポインターを使用する必要がある場合に、それを前方宣言しようとするだけですが、コンパイラーはtest.cpp:8: error: using typedef-name ‘Test1’ after ‘class’
、obj がまったく必要ないため、サイズとは関係ありません。テンプレート全体を取り込みたくない ".h" ファイル内のポインター。
これは g++ です。

//Works
class Test{};
class Test;

//Doesn't work
class Test{};
typedef Test Test1;
class Test1;

ヒントはありますか?

4

3 に答える 3

17

そのとおりです。typedef-name は、そのような前方宣言では使用できません (これは技術的には精巧な型指定子と呼ばれ、そのような指定子が typedef-name に解決される場合、プログラムの形式は正しくありません)。

そもそも前方宣言が実際に必要な理由がわかりません。既に typedef が配置されている場合は、その typedef を使用してみませんか? それはそのクラスを示すだけでもあります。

編集:あなたのコメントから、指定された前方宣言ヘッダーが必要なようです<iosfwd>. したがって、テンプレートが呼び出されTest_Template_Name_Longた場合、このヘッダーは次のようになります

TestFwd.h

template<typename A, typename B> 
class Test_Template_Name_Long;

typedef Test_Template_Name_Long<int, bool> Test1;

次にclass Test1、コンパイラーはそれが何であるかについての手がかりを持たない .

于 2010-02-14T22:49:38.027 に答える
2
typedef Test Test1;
class Test1;

typedefステートメントが Test1 型の宣言として機能するため、失敗します。

基本的に、コンパイラは typedef を確認すると、Test1 が Test のシノニムであることを認識します。次に、 が表示されるとclass Test1;、宣言している新しい型があると判断します。しかし、名前 Test1 は既に typedef によって使用されているため、それを宣言として扱うことはできません。

たとえば、Test1 の前方宣言を使用する場合は、その typedef を前方宣言として使用して、各ファイルに typedef を配置する必要があります。したがって、代わりにclass Test1;、次のようにします。

class Test;
typedef Test Test1;
于 2010-02-14T22:50:15.490 に答える
2
于 2012-05-07T18:41:52.327 に答える