c++ - 这个类成员 a 的类型是什么?

标签 c++

我的代码是:

typedef double Money;
class Person
{
    Money get(){return a;}
private:
    typedef long double Money;
    Money a;
};

我定义了这个类,想知道a的类型是double还是long double

函数get()的返回类型是double,对吗?

我使用函数 std:is_same 来测试 a 的类型

typedef double Money;
class Person
{
public:
    Money get(){return a;}
    void test()
    {
        cout<<is_same<decltype(a), double>::value<<endl;  // false
        cout<<is_same<decltype(a), long double>::value<<endl; //true
    }
private:
    typedef long double Money;
    Money a;
};

所以 a 的类型是 long double

最佳答案

在标准中说:

7.1.3 The typedef specifier [dcl.typedef ]

In a given scope, a typedef specifier shall not be used to redefine the name of any type declared in that scope to refer to a different type.

这意味着 C++ 要求 Money 在第一次看到和后来重新计算时必须是同一类型。

您的程序无效,因为第一次计算 Money 时它是 double 类型,而在重新计算时它是 long double 类型。 .. 都在类范围内...

例如,如果您删除 get() 函数,当您声明 a 时,Money 将被评估为 long double


从评论中,我试图更多地解释我的意思:

实际上,这两个 typedef 是在不同的范围内定义的。但是在 Money 的第一次评估期间(对于 get() 定义),由于在全局中完成了 typedef,它的类型是 double范围。

稍后,使用第二个 typedef,我们将 Money 重新定义为 long double 类型。

这里我们试图在相同的范围(类范围)中重新定义之前声明的类型。


看来 Visual Studio 2010 和 2012 都可以。

我用 g++ 4.2.1 和 4.8.1 测试了它,我得到了这个错误:

error: declaration of ‘typedef long double Person::Money’
error: changes meaning of ‘Money’ from ‘typedef double Money’

关于c++ - 这个类成员 a 的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18160290/

相关文章:

c++ - Scons - 使用带有 scons 缓存的自定义预处理器

c++ - STL分配器复制构造函数要求的目的是什么

c++ - 将持续时间值设为双倍

c++ - 使用标准输入重定向输入

C++ - 通过正则表达式分割字符串

C++ 链表 : IndexOf of an object

c++ - 配置文件中的多个重复部分

c++ - 您应该在复制构造函数或赋值运算符中复制静态数据成员吗?

c++ - 带有模板的类的构造方法

c++ - DirectX 屏幕捕获和输出为视频