无法访问类中的 Struct 成员
Posted
技术标签:
【中文标题】无法访问类中的 Struct 成员【英文标题】:Can't access Struct member inside a class 【发布时间】:2014-12-11 05:05:52 【问题描述】:我有课。类有一个结构_tree_branch_m
和一个类成员函数。该结构是成员函数的参数。在成员函数内部,访问结构成员时出错。我的结构有什么问题?错误是Field 'NodeType'
无法解决。
class CascadeClassifier
protected:
typedef char *Set_m;
typedef struct _tree_branch_m *Tree_m;
struct _tree_branch_m
short NodeType; /* 0=leaf 1=branch 2=cut 3=subset */
short Leaf; /* most frequent class at this node */
float Items, /* no of items at this node */
*ClassDist, /* class distribution of items */
Errors; /* no of errors at this node */
short Tested; /* attribute referenced in test */
short Forks; /* number of branches at this node */
float Cut, /* threshold for continuous attribute */
Lower, /* lower limit of soft threshold */
Upper; /* upper limit ditto */
Set_m *Subset; /* subsets of discrete values */
Tree_m *Branch; /* Branch[x] = (sub)tree for outcome x */
;
virtual void ClassifyCase(Tree_m subtree, float Weight, float *LowClassSum, float *ClassSum);
;
void CascadeClassifier::ClassifyCase(Tree_m Subtree, float Weight, float *LowClassSum, float *ClassSum)
if ( ! Subtree->NodeType )//error
【问题讨论】:
究竟是什么错误?在哪一行? 如果您在问题中使用了错误一词,请在问题中包含它。 这是不可重现的,请提供MCVE。 @jogojapan,这没关系,因为当他在函数参数中时,他已经在类的命名空间中。这只对前导返回类型很重要(但不是尾随类型,这就是它们存在的原因。) 抱歉添加了错误信息。错误是无法解析字段“NodeType”。谢谢 【参考方案1】:3.3.2/6在elaborated-type-specifier中首先声明的类的声明点如下:
——用于表单声明
class-key attribute-specifier-seq_opt 标识符;
标识符被声明为一个 class-name 在范围内 包含声明,否则
——用于详细类型说明符的形式
类键标识符
...标识符在最小的命名空间或块中声明 包含声明的范围。
当您编写typedef struct _tree_branch_m *Tree_m;
时,struct _tree_branch_m
向前声明了一个全局范围内的名称::_tree_branch_m
。 Tree_m
与 CascadeClassifier::_tree_branch_m
没有任何关系。
您需要显式前向声明成员结构:
class CascadeClassifier
struct _tree_branch_m; // forward delcaration
typedef _tree_branch_m *Tree_m;
struct _tree_branch_m ...;
;
【讨论】:
谢谢,我在标准中寻找这个,你省了我的麻烦。所以他是违反了保留的命名规则。这很有趣。【参考方案2】:实际示例:http://ideone.com/OxaJVj
您在将结构分配给 typedef 的同时向前声明结构。我不知道这是否是犹太洁食,我必须检查标准。但是只需将这两个步骤分开就可以了:
typedef struct _tree_branch_m *Tree_m;
到
struct _tree_branch_m;
typedef _tree_branch_m *Tree_m;
话虽如此,我建议不要使用前导下划线,因为即使您在技术上不违反标准,如果您要将 T 大写或放置第二个 _ 或将其移动到您的全局命名空间' d 违反保留名称。
【讨论】:
以上是关于无法访问类中的 Struct 成员的主要内容,如果未能解决你的问题,请参考以下文章