为什么子类看不到父类';在C++;? 我最近遇到了一些C++代码,在父类中, TyPulf< /Cord> ED A Stutt。然而,它似乎在子类中不可用,即使它没有标记为private(它是受保护的)。我在下面创建了一个演示此失败的最小工作示例(如下)。我已经公开了一切,但仍然失败。给出的错误是(使用g++): A.h(汇编) 模板类别A{ 公众: 类型定义结构{ sx; T y; }基准面; }; B.h(不编译) #包括“A.h” 模板类别B:公共A{ 公众: 无效输出(常数基准和数据); }; B.h(汇编) #包括“A.h” 模板类别B:公共A{ 公众: 类型定义结构{ qx; Q-y; }基准面; 无效输出(常数基准和数据); };
为什么为什么子类看不到父类';在C++;? 我最近遇到了一些C++代码,在父类中, TyPulf< /Cord> ED A Stutt。然而,它似乎在子类中不可用,即使它没有标记为private(它是受保护的)。我在下面创建了一个演示此失败的最小工作示例(如下)。我已经公开了一切,但仍然失败。给出的错误是(使用g++): A.h(汇编) 模板类别A{ 公众: 类型定义结构{ sx; T y; }基准面; }; B.h(不编译) #包括“A.h” 模板类别B:公共A{ 公众: 无效输出(常数基准和数据); }; B.h(汇编) #包括“A.h” 模板类别B:公共A{ 公众: 类型定义结构{ qx; Q-y; }基准面; 无效输出(常数基准和数据); };,c++,templates,inheritance,name-lookup,C++,Templates,Inheritance,Name Lookup,为什么B.h的第一个版本没有编译?第二种选择安全吗?有没有更好的(更简洁或更惯用的)方法来处理这个问题?您需要在B内部说typename a::Datum。因为基是一个模板,所以它的名称是从属名称,在第一阶段不可见,您需要typename指定名称命名类型(而不是值或模板) 您还应该丢失typedef。C++与C的工作方式不同,你应该说: struct Datum { S x; T y }; 您需要在B内说typename A::Datum。因为基是一个模板,所以它的名称是从属名称,在第一阶段不
B.h
的第一个版本没有编译?第二种选择安全吗?有没有更好的(更简洁或更惯用的)方法来处理这个问题?您需要在B
内部说typename a::Datum
。因为基是一个模板,所以它的名称是从属名称,在第一阶段不可见,您需要typename
指定名称命名类型(而不是值或模板)
您还应该丢失typedef
。C++与C的工作方式不同,你应该说:
struct Datum { S x; T y };
您需要在
B
内说typename A::Datum
。因为基是一个模板,所以它的名称是从属名称,在第一阶段不可见,您需要typename
指定名称命名类型(而不是值或模板)
您还应该丢失typedef
。C++与C的工作方式不同,你应该说:
struct Datum { S x; T y };
这个
他身体不好typedef
需要一个类型和一个“别名”来命名该类型。你可能需要的是
template<typename S, typename T>
class A {
public:
struct Datum { S x; T y; };
};
这个
他身体不好typedef
需要一个类型和一个“别名”来命名该类型。你可能需要的是
template<typename S, typename T>
class A {
public:
struct Datum { S x; T y; };
};
我确信
A.h
并没有像编写的那样编译。@KerrekSB谢谢。我的处境是无法复制和粘贴,因此我在其中出错。现在已修复。@BoPersson的可能重复答案证明是相关的,但我会说这个问题不是重复的,因为如果我知道这个问题有多密切的关系,我可能已经知道我的解决方案了。也就是说,我会说答案是相似的,但问题是不同的。@Kazark-这是一个意见问题。:-)关于为什么模板化基类中的名称不可见,有很多问题——都是出于同样的原因。“链接到”问题的类型定义与此相同,但问题是一般性的。我相信A.h
不会按书面形式编译。@KerrekSB谢谢。我的处境是无法复制和粘贴,因此我在其中出错。现在已修复。@BoPersson的可能重复答案证明是相关的,但我会说这个问题不是重复的,因为如果我知道这个问题有多密切的关系,我可能已经知道我的解决方案了。也就是说,我会说答案是相似的,但问题是不同的。@Kazark-这是一个意见问题。:-)关于为什么模板化基类中的名称不可见,有很多问题——都是出于同样的原因。链接到的问题具有与此相同的typedef
,但问题是一般性的。您还需要输入typename
。您还需要输入typename
。
struct Datum { S x; T y };
typedef struct {
S x;
T y;
}
template<typename S, typename T>
class A {
public:
struct Datum { S x; T y; };
};
#include "A.h"
template<typename Q>
class B : public A<Q, Q> {
public:
void output(const typename A<Q,Q>::Datum& dat);
};