【问题标题】:Output the type of a typedef at compile time in C++ (specifically when an error occurs)在 C++ 编译时输出 typedef 的类型(特别是发生错误时)
【发布时间】:2023-03-09 08:51:01
【问题描述】:

我很难解释这个特殊的问题/问题,所以请多多包涵(我的所有与模板相关的问题都有问题!)。

以这段代码为例(注意,展示代码的目的是展示一个复杂的模板层次结构,而不是它是否有意义):

#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,这样我就可以修复错误,而无需一直追溯到 MiddleMan。我不想手动跟踪的原因是代码可能是非常复杂的模板代码,很难进行追溯。

我想既然编译器已经确定了类型,它应该能够让我知道,即应该有一种简单的方法可以在编译时找出它(可能通过输出窗口中的消息)类型附加到typedefs。有什么简单的方法吗?


解决方案编辑:这是另一个示例,在阅读所选答案后可能会对未来的 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>        ]

【问题讨论】:

标签: c++ templates typedef


【解决方案1】:

有一些技巧可以让编译器向您显示 typedef 的实际类型。一种是尝试实例化一个不完整的类型。

template<typename>
struct Printer;

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

还有boost::mpl::print 实际上可以发出警告而不是出错。

所有这些技术都必须在类型名实际可访问的地方使用,因此您最终必须“跟踪”代码。

遗憾的是,调试模板代码几乎是一门黑魔法,通常您必须在脑海中运行编译器并实例化一些东西才能解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多