この特定の問題/質問を説明するのは非常に難しいので、私はすべてのテンプレートに問題があります関連する質問!)。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_type
、value_type1
、value_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> ]
関連:[inspect C++テンプレートのインスタンス化](http://stackoverflow.com/questions/2886984/inspect-c-template-instantiation) –
@GeorgFritzsche:その質問の良いリンク(+1) – Samaursa