错误:请求“ ..”中的成员“ ..”属于非类类型
我有一个带有两个构造函数的类,一个不带参数,而一个带一个参数。
使用接受一个参数的构造函数创建对象的工作符合预期。 但是,如果我使用不带参数的构造函数创建对象,则会出现错误。
例如,如果我编译此代码(使用g ++ 4.0.1)...
<code>class Foo {public:Foo() {};Foo(int a) {};void bar() {}; };int main() {// this works...Foo foo1(1);foo1.bar();// this does not...Foo foo2();foo2.bar();return 0; }
...我收到以下错误:
nonclass.cpp: In function ‘int main(int, const char**)’:
nonclass.cpp:17: error: request for member ‘bar’ in ‘foo2’, which is of non-class type ‘Foo ()()’
为什么会这样,如何使它起作用?
#1楼
只是为了记录。
它实际上不是您的代码的解决方案,但是当错误地访问myPointerToClass
指向的类实例的方法时,我遇到了相同的错误消息。
MyClass* myPointerToClass = new MyClass();
myPointerToClass.aMethodOfThatClass();
哪里
myPointerToClass->aMethodOfThatClass();
显然是正确的。
#2楼
添加到知识库中,我遇到了相同的错误
if(class_iter->num == *int_iter)
即使IDE为我提供了class_iter的正确成员。 显然,问题在于"anything"::iterator
没有名为num
的成员,因此我需要取消引用它。 不能这样工作:
if(*class_iter->num == *int_iter)
...显然。 我最终用以下方法解决了它:
if((*class_iter)->num == *int_iter)
我希望这可以帮助像我一样遇到这个问题的人。
#3楼
我遇到了类似的错误,似乎编译器误解了对不带参数的构造函数的调用。 我通过从变量声明中删除括号来使其工作,在您的代码中如下所示:
class Foo
{public:Foo() {};Foo(int a) {};void bar() {};
};int main()
{// this works...Foo foo1(1);foo1.bar();// this does not...Foo foo2; // Without "()" foo2.bar();return 0;
}
#4楼
当您不打算使用参数化的构造函数时,不需要括号来实例化类对象。
只需使用Foo foo2;
它会工作。
#5楼
我遇到了一个错误消息,
Foo foo(Bar());
并基本上试图将临时Bar对象传递给Foo构造函数。 原来编译器正在将其翻译成
Foo foo(Bar(*)());
也就是说,名称为foo的函数声明返回一个带参数的Foo -函数指针返回带0个参数的Bar。 当这样传递临时消息时,最好使用Bar{}
而不是Bar()
消除歧义。
#6楼
如果要声明不带参数的新物质(知道对象具有默认参数),请不要编写
type substance1();
但
type substance;
#7楼
当然可以解决此错误,但是当尝试重载赋值operator=
时,我在另一种情况下收到了它。 这是一个有点神秘的IMO(来自g ++ 8.1.1)。
#include <cstdint>enum DataType
{DT_INT32,DT_FLOAT
};struct PrimitiveData
{union MyData{int32_t i;float f;} data;enum DataType dt;template<typename T>void operator=(T data){switch(dt){case DT_INT32:{data.i = data;break;}case DT_FLOAT:{data.f = data;break;}default:{break;}}}
};int main()
{struct PrimitiveData pd;pd.dt = DT_FLOAT;pd = 3.4f;return 0;
}
我收到2个“完全相同”的错误
error: request for member ‘i’ [and 'f'] in ‘data’, which is of non-class type ‘float’
( clang
的等效错误是: error: member reference base type 'float' is not a structure or union
)
对于行data.i = data;
和data.f = data;
。 事实证明,编译器混淆了局部变量名称'data'和我的成员变量data
。 当我将其更改为void operator=(T newData)
和data.i = newData;
, data.f = newData;
,错误消失了。
#8楼
Foo foo2();
改成
Foo foo2;
因为编译器认为您得到错误
Foo foo2()
从名称为“ foo2”的函数声明开始,返回类型为“ Foo”。
但是在那种情况下,如果我们更改为Foo foo2
,则编译器可能会显示错误" call of overloaded 'Foo()' is ambiguous"
。
错误:请求“ ..”中的成员“ ..”属于非类类型相关推荐
- C++ 学习 ::【基础篇:13】:C++ 类的基本成员函数:类类型成员的初始化与构造函数问题
本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...
- 列表中的字符串成员 转化为 整型成员 。如:将[‘2‘, ‘1‘] 转化为:[2, 1]、map()返回的是一个可迭代对象内存地址、join(可迭代对象),要注意:可迭代对象中的成员必须是字符串类型
注意: 1.map()返回的是一个可迭代对象的内存地址,如果要看它具体的值,有两种方式: 法1:在map()前面,加list( ).tuple( ).set( ),将它强制转化为列表.元组.集合类型. ...
- [YTU]_2618 ( B 求类中数据成员的最大值-类模板)
题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函数来获取这三个数据成员的最大值. 类模板声明如下: template<class numtype> class Max { ...
- 【Groovy】Groovy 方法调用 ( Groovy 构造函数中为成员赋值 | Groovy 函数的参数传递与键值对参数 | 完整代码示例 )
文章目录 一.Groovy 构造函数中为成员赋值 二.Groovy 函数的参数传递与键值对参数 三.完整代码示例 一.Groovy 构造函数中为成员赋值 Groovy 类没有定义构造函数 , 但是可以 ...
- C++类中const函数与非const函数的调用规则
class EX{public:void constFunction() const; }; 如上所示,通过将类成员函数声明为const,以表示这个函数不可以修改类中的成员变量. 建议将不可以修改数据 ...
- 类中const函数及非const函数的调用规则
转自:点击打开链接 类中const函数及非const函数的调用规则 class Student { public:int getAge(){return m_age;}int getAge() con ...
- C++ 类中数据成员分布详解
概述 我们都知道类中包含着数据成员,但是数据成员在内存中是怎样分布的呢?继承之后数据又是怎样布局的呢?下面对这些问题进行整理解答.首先说明的是类的空间分布是编译器编译的结果,不同的编译器有可能会不一样 ...
- php键顺序初始化,Java类中各成员初始化的顺序
了解Java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println(&quo ...
- 为什么Android教程中的大多数字段(类成员)都以`m`开头?
我知道骆驼案例规则,但我对这个规则感到困惑. 它代表什么? 我是一名PHP开发人员. "我们"使用变量的第一个字母作为类型的指示,如"b"表示布尔值," ...
最新文章
- 如何关闭jdk自动更新提示
- linux运维实战练习-2015年9月13日-9月15日课程作业(练习)安排
- 【计算机网络】网络安全 : 入侵检测系统 ( 基于特征的入侵检测系统 | 基于异常的入侵检测系统 )
- python函数大全和意思_python 之 内置函数大全
- 对IP专用(私有)地址的理解!
- 用python可以处理xml文件怎么打开_Python大神都是这样处理xml文件的!
- 使用IntelliJ IDEA的原因
- java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String
- Vue和后台交互的方式
- 我喜欢c语言用英文版,说说我喜欢英语的几个理由
- java作用域对象笔记_Java学习笔记(七)——对象
- SD卡, EMMC固化 ,关于bootloader linux
- 查看硬盘转速_【装机帮扶站】第538期:哪些CPU、板卡、硬盘对于普通消费者而言不太值得购买?...
- el-select 默认选中url参数对应的选项
- 安卓永久修改像素密度
- CMD命令行查询电脑硬件信息
- 360浏览器打不开html5文件,360浏览器打不开oa_打不开360浏览器
- 什么是动态代理,动态代理的应用有哪些
- 宽带拨号常见错误代码解析及故障排查
- DTO-VO-DO-Query理解