Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么子类看不到父类';在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 - Fatal编程技术网

为什么子类看不到父类';在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);
};