【发布时间】: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_type、value_type1、value_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> ]
【问题讨论】:
-
@GeorgFritzsche:该问题中的链接很好 (+1)