Мне очень сложно объяснить эту конкретную проблему / вопрос, поэтому, пожалуйста, терпите меня (у меня проблемы со всеми моими вопросами, связанными с шаблоном!).
Возьмите этот код в качестве примера (обратите внимание, что цель показа кода - показать сложную иерархию шаблонов, а не то, имеет ли это смысл):
#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
, чтобы я мог исправить ошибку, не отслеживая ее до MiddleMan. Причина, по которой я не хочу отслеживать ma Обычно это то, что код может быть довольно сложным шаблоном, где очень сложно выполнить обратную трассировку.
Я подумал, поскольку компилятор уже определил типы, он должен иметь возможность сообщить мне, т.е.должен быть простой способ выяснить во время компиляции (возможно, через сообщение в окне вывода) типы, присоединенные к typedef
s. Есть ли простой способ?
РЕДАКТИРОВАНИЕ-РЕШЕНИЕ: Вот еще один пример, который может помочь будущему SOer после прочтения выбранного ответа:
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;
}
Вывод из Visual C ++ 2008:
error C2079: 'test' uses undefined struct 'incomplete<T>'
1> with
1> [
1> T=float
1> ]