Вывести тип typedef во время компиляции в 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 , чтобы я мог исправить ошибку, не отслеживая ее до 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>        ]
5
задан Samaursa 23 January 2012 в 04:23
поделиться