gpt4 book ai didi

c++ - "typename"和 "template"关键字 : are they really necessary?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:32 24 4
gpt4 key购买 nike

编译c++模板代码时,这个站点上有很多问题。此类问题最常见的解决方案之一是在程序代码的正确位置添加 typename(以及不太常见的 template)关键字:

template<typename T>
class Base
{
public:

typedef char SomeType;

template<typename U>
void SomeMethod(SomeType& v)
{
// ...
}

};

template<typename T>
class Derived : public Base<T>
{
public:

void Method()
{
typename Base<T>::SomeType x;
// ^^^^^^^^

this->template SomeMethod<int>(x);
// ^^^^^^^^
}
};

是否有一段代码可以在使用和不使用关键字 typename 的情况下进行编译并给出不同的结果(例如输出字符串)? template 关键字的类似问题。

如果不是,这些关键词是否真的有必要?

当前情况的小概览

@Paul Evans写的不错 但是更适合问题"Where and why do I have to put the “template” and “typename” keywords?" ,不是我的问题。

@Simple举了一个例子the required code for typename keywordits possible variation . @Jarod42给了another variation without any templates ,这可能是一个 gcc 错误,因为它 does not compile with clang .

@n.m.举了一个例子the required code for template keyword , @dyp improved it . @n.m.还写了the another code for both keywords使用 SFINAE .

@James Kanze在他的回答中认为,编写所需的代码是不可能的,任何尝试这样做都会导致未定义的行为。所以上面的例子代码是非法的。

有趣的是找出谁是正确的以及 C++ 标准对此有何规定。

最佳答案

规则是:typename 必须在依赖于模板参数的名称是类型时使用。有明显的情况需要它,考虑

template <typename T> 
class Foo {
typename T::type * p;
//...
};

在这里,第二个typename用于表示 typeclass T 中定义的类型.因此,p是指向类型 T::type 的指针.

没有typename , type将被视为 class T 的成员.所以表达:

T::type * p

将是 type 的乘积class T的成员与 p .

同样,规则是:.template , ->template::template 必须 在访问使用模板参数的模板成员时使用。考虑:

 p->template SomeMethod<int>(x);

不使用 template ,编译器不知道 < token 不是小于,而是模板参数列表的开始。

关于c++ - "typename"和 "template"关键字 : are they really necessary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22069758/

24 4 0