gpt4 book ai didi

c++ - 添加typename导致程序编译失败

转载 作者:太空狗 更新时间:2023-10-29 21:13:07 27 4
gpt4 key购买 nike

所以我有这段代码:

#include "type_traits"

struct A{
int member;
};

struct B{
typedef A object;
typedef int member;
};

typedef std::integral_constant<B::member, B::object::*, &A::member> type;

但如果我将最后一行更改为:

typedef std::integral_constant<typename B::member, typename B::object::*, &A::member> type;

程序不会编译....

为什么添加 typename 说明符会导致程序无法编译?这让我特别惊讶,因为我认为在这种情况下我需要它。

注意:使用 gcc 5.1.0

最佳答案

您不能在任何要指定类型的地方添加 typename。您只能并且要求在使用依赖类型名称时添加 typename

从属名称是这样的:

template<typename T>
void foo() { (void)T::member(); }

T::member 是一个类型,还是一个名为member 的成员函数?默认情况下,编译器会假定它不是一种类型。如果是类型,则必须指定 typename 来消除歧义。

template<typename T>
void foo() { (void)typename T::member(); }

现在编译器被告知假设 T::member 确实是一个类型。

但是,C++ 语法只允许在 T::member 的性质未知的情况下使用。因此,在处理已知类型(例如您的代码)时,编译器已经知道这些成员是类型。没有什么可以消除歧义的。

如果您要通过模板别名更改 typedef,它将需要 typename,如您所写:

template<typename C, typename D> //          v----- Type of pointer to member?
using type = std::integral_constant<typename D::member D::object::*, &C::member>;
// Here, D::object::* don't need typename, ----^
// since only types are allowed here

关于c++ - 添加typename导致程序编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45497511/

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