2012-01-22 14 views
4

この特定の問題/質問を説明するのは非常に難しいので、私はすべてのテンプレートに問題があります関連する質問!)。C++でコンパイル時に型定義の型を出力する(特にエラーが発生したとき)

例(コードを示すのポイントは、それが理にかなっていないかどうか、複雑なテンプレート階層を示すことであることに注意)として、このコードを取る:

#include <string> 
#include <vector> 
#include <list> 

template <typename T> 
struct Foo 
{ 
    typedef typename T::value_type value_type; 
    typedef typename T::value_type1 value_type1; 
    typedef typename T::value_type2 value_type2; 

    Foo() {} 
    Foo(value_type1, value_type, value_type2) {} 
    Foo(value_type, value_type1, value_type2) {} 
}; 

template <typename T, typename T1, typename T2> 
struct MiddleMan 
{ 
    typedef T value_type; 
    typedef T1 value_type1; 
    typedef T2 value_type2; 
}; 

template <typename T> 
struct MainClass 
{ 
    typedef typename T::value_type value_type; 
    typedef typename T::value_type1 value_type1; 
    typedef typename T::value_type2 value_type2; 

    typedef MainClass<T> this_type; 

    typedef Foo<this_type> iterator; 
}; 

using namespace std; 

int main() 
{ 
    typedef MiddleMan<string, vector<string>, list<vector<string> > > mm; 
    MainClass<mm>::iterator a(1, 2, 3); 

    return 0; 
} 

、これはエラーあなたであると仮定3つの過負荷の

なしすべての引数の型

注意を変換することができなかった取得しています私がこのインスタンスで知っているコードをコンパイルする場合、エラーメッセージは上記と同じではありませんが、私が現在作業している私の複雑なテンプレートコードのエラーメッセージは上記のものです。私はその質問を助けるための簡単な例を提示しました。

は今、私が仲介にすべての方法を遡っせずに、エラーを修正することができるようにFoo、すなわちvalue_typevalue_type1value_type2の種類を知りたいです。私が手動でトレースしたくない理由は、コードをトレースバックが非常に難しい複雑なテンプレートコードにすることができるからです。

コンパイラは既に型を見つけたので、コンパイル時に(出力ウィンドウのメッセージを介して)簡単に理解できるはずです。 typedefに添付されている種類。簡単な方法はありますか?


SOLUTION-EDIT:ここは、選択した答えを読んだ後、将来SOerを助けるかもしれない別の例である:ビジュアルC++ 2008から

template <typename T> struct incomplete; 

template <typename T, typename T2, typename T3> 
class foo 
{ 
public: 
    typedef T value_type; 
    typedef T2 value_type2; 
    typedef T3 value_type3; 
}; 

int main() 
{ 
    // Assume the following type is much more complex 
    typedef foo<float, int, char> type_i_am_having_trouble_with; 

    // At this point you are instantiating it, and the program compiles (or maybe 
    // not) and you have no idea what some of the typedefs stand for 
    type_i_am_having_trouble_with b; 

    // Use this to find out what the typedefs stand for 
    incomplete<type_i_am_having_trouble_with::value_type> test; 
} 

出力:

error C2079: 'test' uses undefined struct 'incomplete<T>' 
1>  with 
1>  [ 
1>   T=float 
1>  ] 
+1

関連:[inspect C++テンプレートのインスタンス化](http://stackoverflow.com/questions/2886984/inspect-c-template-instantiation) –

+0

@GeorgFritzsche:その質問の良いリンク(+1) – Samaursa

答えて

7

ありますtypedefの実際の型をコンパイラに示すためのトリックです。 1つは、不完全な型をインスタンス化しようとすることです。

template<typename> 
struct Printer; 

typedef std::vector<int> foobartype; 
Printer<foobartype> printer; 

なく、実際に出てerroringの警告を発行することができboost::mpl::printもあります。

これらのテクニックはすべて、型名が実際にアクセス可能な場所で使用する必要があります。そのため、最終的にコードをトレースする必要があります。

悲しいことに、悲しいことに、テンプレートコードのデバッグはかなり黒い芸術であり、多くの場合、問題を解決するためにコンパイラを再生して物事を具体化する必要があります。

+0

不完全なタイプのトリックはこれまでのところうまくいっています、ありがとう! (+1) – Samaursa

関連する問題