我有一个带有两个构造函数的类,一个不带参数,而一个带一个参数。

使用接受一个参数的构造函数创建对象的工作符合预期。 但是,如果我使用不带参数的构造函数创建对象,则会出现错误。

例如,如果我编译此代码(使用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"

错误:请求“ ..”中的成员“ ..”属于非类类型相关推荐

  1. C++ 学习 ::【基础篇:13】:C++ 类的基本成员函数:类类型成员的初始化与构造函数问题

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

  2. 列表中的字符串成员 转化为 整型成员 。如:将[‘2‘, ‘1‘] 转化为:[2, 1]、map()返回的是一个可迭代对象内存地址、join(可迭代对象),要注意:可迭代对象中的成员必须是字符串类型

    注意: 1.map()返回的是一个可迭代对象的内存地址,如果要看它具体的值,有两种方式: 法1:在map()前面,加list( ).tuple( ).set( ),将它强制转化为列表.元组.集合类型. ...

  3. [YTU]_2618 ( B 求类中数据成员的最大值-类模板)

    题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函数来获取这三个数据成员的最大值. 类模板声明如下: template<class numtype> class Max { ...

  4. 【Groovy】Groovy 方法调用 ( Groovy 构造函数中为成员赋值 | Groovy 函数的参数传递与键值对参数 | 完整代码示例 )

    文章目录 一.Groovy 构造函数中为成员赋值 二.Groovy 函数的参数传递与键值对参数 三.完整代码示例 一.Groovy 构造函数中为成员赋值 Groovy 类没有定义构造函数 , 但是可以 ...

  5. C++类中const函数与非const函数的调用规则

    class EX{public:void constFunction() const; }; 如上所示,通过将类成员函数声明为const,以表示这个函数不可以修改类中的成员变量. 建议将不可以修改数据 ...

  6. 类中const函数及非const函数的调用规则

    转自:点击打开链接 类中const函数及非const函数的调用规则 class Student { public:int getAge(){return m_age;}int getAge() con ...

  7. C++ 类中数据成员分布详解

    概述 我们都知道类中包含着数据成员,但是数据成员在内存中是怎样分布的呢?继承之后数据又是怎样布局的呢?下面对这些问题进行整理解答.首先说明的是类的空间分布是编译器编译的结果,不同的编译器有可能会不一样 ...

  8. php键顺序初始化,Java类中各成员初始化的顺序

    了解Java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println(&quo ...

  9. 为什么Android教程中的大多数字段(类成员)都以`m`开头?

    我知道骆驼案例规则,但我对这个规则感到困惑. 它代表什么? 我是一名PHP开发人员. "我们"使用变量的第一个字母作为类型的指示,如"b"表示布尔值," ...

最新文章

  1. 如何关闭jdk自动更新提示
  2. linux运维实战练习-2015年9月13日-9月15日课程作业(练习)安排
  3. 【计算机网络】网络安全 : 入侵检测系统 ( 基于特征的入侵检测系统 | 基于异常的入侵检测系统 )
  4. python函数大全和意思_python 之 内置函数大全
  5. 对IP专用(私有)地址的理解!
  6. 用python可以处理xml文件怎么打开_Python大神都是这样处理xml文件的!
  7. 使用IntelliJ IDEA的原因
  8. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String
  9. Vue和后台交互的方式
  10. 我喜欢c语言用英文版,说说我喜欢英语的几个理由
  11. java作用域对象笔记_Java学习笔记(七)——对象
  12. SD卡, EMMC固化 ,关于bootloader linux
  13. 查看硬盘转速_【装机帮扶站】第538期:哪些CPU、板卡、硬盘对于普通消费者而言不太值得购买?...
  14. el-select 默认选中url参数对应的选项
  15. 安卓永久修改像素密度
  16. CMD命令行查询电脑硬件信息
  17. 360浏览器打不开html5文件,360浏览器打不开oa_打不开360浏览器
  18. 什么是动态代理,动态代理的应用有哪些
  19. 宽带拨号常见错误代码解析及故障排查
  20. DTO-VO-DO-Query理解

热门文章

  1. android 屏幕录像
  2. Service Intent must be explicit
  3. Android selector
  4. swift_000(Swift 的导读必看)
  5. json最大长度限制_GET请求中URL的最大长度限制总结,读完之后,大部分程序员收藏了...
  6. 读书笔记-大型网站技术架构(核心原理与案例分析)
  7. 单点登录系统实现基于SpringBoot
  8. Sql Server 字符串操作总结
  9. bestcoder#51
  10. Android ImageView的ScaleType属性