gpt4 book ai didi

c++ - 模板中的关键字 "typename"

转载 作者:行者123 更新时间:2023-11-30 01:29:39 30 4
gpt4 key购买 nike

以下是代码,引用自 Addison Wesley 的 C++ 模板:

template <typename T> 
class MyClass {
typename T::SubType * ptr;

};

Without typename, SubType would be considered a static member. Thus, it would be a concrete variable or object. As a result, the expression T::SubType *ptr would be a multiplication of the static SubType member of class T with ptr.

现在,当我编译没有关键字“typename”的代码时,我得到的错误是:type ‘T’ is not derived from type ‘MyClass<T>’ .

编译器是否识别“T”?如果不是,那么它不应该是一个 undefined reference 错误吗?如果是,那么为什么这是一个错误?

好的,这是完整的代码:

#include <iostream>
#include <vector>

template <typename T> class MyClass
{
T::SubType * ptr;
};

int main ()
{
return 0;
}

我得到的错误是这样的:

~/Desktop/notes **g++ templates/programs/trial.cpp**
templates/programs/trial.cpp:6: error: type ‘T’ is not derived from type ‘MyClass<T>’
templates/programs/trial.cpp:6: error: expected ‘;’ before ‘*’ token

最佳答案

这是从 g++ 中获取相同错误的另一种方法:

class Foo { static const int x = 0;};

template <typename T> class MyClass
{
Foo::x * ptr;
};

还有一个:

class Foo { static const int x = 0;};

class MyClass
{
Foo::x * ptr;
};

但是你会得到一个不同的错误:

// class Foo { static const int x = 0;};

template <typename T> class MyClass
{
Foo::x * ptr;
};

所以:

  1. 因为 T 是依赖类型,g++ 假定 T::SubType 是一个对象,它将在第二阶段查找发生时定义。这符合预期,也是此处需要 typename 的常见原因。

  2. 即使 T::SubType 存在并且是一个对象,代码仍然很糟糕,就像Foo::x *ptrFoo::x 存在并且是一个对象时是错误的。我仍然不明白错误消息是关于什么的——从 MyClass 派生 Foo 有什么帮助?但错误信息与模板无关。

  3. “ undefined reference ”是链接器错误。由于此代码甚至无法编译,因此您不应期望在任何地方看到“对 T 的 undefined reference ”。

  4. 到目前为止,我什至不明白 Foo 是如何从 MyClass 派生的。我尝试了以下方法以查看它是否会为原始消息的含义提供线索,但它失败了,因为 MyClass 是一个不完整的类型,它没有告诉我如果 会发生什么code>Foo 派生自 MyClass:

class MyClass
{
class Foo: public MyClass { static const int x = 0;};
Foo::x * ptr;
};

Comeau 为所有这些情况提供了更明智的错误消息 - 与派生类型无关,只是说 T::SubType 不是类型。因此,解释 g++ 的错误消息需要了解或猜测 g++ 内部结构,以及在尝试解析类模板的过程中它最终放弃的确切位置。

关于c++ - 模板中的关键字 "typename",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5577950/

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