我的代码是:
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/