gpt4 book ai didi

c++ - 模板类型定义错误

转载 作者:太空狗 更新时间:2023-10-29 19:55:52 25 4
gpt4 key购买 nike

谁能解释为什么这段代码会报错:

error C2039: 'RT' : is not a member of 'ConcreteTable'

(至少在使用 VS2008 SP1 编译时)

class  Record
{
};

template <class T>
class Table
{
public:
typedef typename T::RT Zot; // << error occurs here
};

class ConcreteTable : public Table<ConcreteTable>
{
public:
typedef Record RT;
};

可以做些什么来修复它。谢谢!

更新:感谢指出问题并提出所有建议。此代码段基于在现有代码库中提供扩展点的代码,主要设计目标是减少使用此机制添加新扩展所需的工作量(输入)。

一个单独的“类型特征”样式类实际上最适合解决方案。特别是如果风格警察不注意的话,我什至可以将它包装在 C 风格的宏中!

最佳答案

那是因为在实例化 Table 时类 ConcreteTable 还没有被实例化,所以编译器还没有看到 T::RT。我不太确定 C++ 标准究竟是如何处理这种递归的(我怀疑它是未定义的),但它并不像你期望的那样工作(这可能很好,否则事情会复杂得多 - 你可以用它表达一个逻辑悖论——就像一个 const bool,如果它是真的,它就是假的)。

修复

对于 typedef,我认为除了将 RT 作为额外的模板参数传递之外别无他法,就像这样

template <class T, class RT>
class Table
{
public:
typedef typename RT Zot;
};

class ConcreteTable : public Table<ConcreteTable, Record>
{
public:
typedef Record RT;
};

如果您不坚持将 RT 作为 Table<>::Zot 提供,你可以把它放在一个嵌套的结构中

template <class T>
class Table
{
public:
struct S {
typedef typename RT Zot;
};
};

class ConcreteTable : public Table<ConcreteTable>
{
public:
typedef Record RT;
};

甚至外部特征结构

template <class T>
struct TableTraits<T>;

template <class T>
struct TableTraits<Table<T> > {
typedef typename T::RT Zot;
};

如果你只希望类型是一个方法的参数/返回类型,你可以通过模板化这个方法来实现,例如。

void f(typename T::RT*); // this won't work

template <class U>
void f(U*); // this will

所有这些操作的目的是尽可能晚地推迟对 T::RT 的需求,尤其是在 ConcreteTable 成为一个完整的类之后。

关于c++ - 模板类型定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/497408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com