2013-01-24 240 views
0

我有一个载体类是这样的:C++类函数的返回类型定义,返回一个类

class Vector3 
{ 

public: 
    Vector3(){m_x = m_y = m_z = 0.0f;} 
    Vector3(const float & i_x, const float & i_y, const float & i_z): 
    m_x(i_x), 
    m_y(i_y), 
    m_z(i_z) 
    {} 

    Vector3 operator+(const Vector3 & i_other); 
private: 
    float m_x; 
    float m_y; 
    float m_z; 
}; 

Vector3::Vector3 Vector3::operator+(const Vector3 & i_other) 
{ 
    float tx = m_x + i_other.m_x; 
    float ty = m_y + i_other.m_y; 
    float tz = m_z + i_other.m_z; 
    return Vector3(tx, ty, tz); 
} 

显然,Vector3::operator+定义synax是错误的,因为返回类型Vector3::Vector3,不Vector3Vector3::Vector3表示有一个名称空间Vector3,并且在名称空间内有一个Vector3类。但我只有一个类Vector3,这里没有命名空间。

我的问题是,在Ubuntu 12.04中,上面的语法无法编译(Ubuntu的g ++编译器是[gcc版本4.6.3])。但是,在Mac中,g ++可以编译代码(Mac的g ++编译器是[gcc version 4.2.1])。另外,我在Red Hat linux机器上测试这个语法,它也起作用(g ++版本是[gcc版本4.4.6])

那么,它是不同版本的gcc有不同的编译原理吗?或者,我在Ubuntu的g ++打破了?

+2

这是相关的:http:// stackoverflow。com/questions/12135498/why-are-redundant-scope-qualifications-by-the-compiler-and-is-it-lega – chris

+1

不是答案,而是:将浮点参数作为参考传递的意义到构造函数? – jogojapan

+0

@jogojapan:也许对于浮点,没有必要传递一个引用。但我认为使用constance引用传递参数可以使代码稳定。 – geekmayplay

回答

2

较旧的编译器不正确。那里一点惊喜。

它可能将Vector3::Vector3解析为注入型名称。在class Vector3 { }的范围内,标识Vector3指的是类,而不是构造函数(当然,除非是在声明构造函数时)。乍一看,你可能认为它在返回类型中意味着同样的事情,因为§3.4/ 3(我在这里使用C++ 11标准)说

注入类名一个类(第9章)也被认为是该类名称隐藏和查找的成员。

挖较深,在§3.4.3.1/ 2,

在查找,其中所述构造函数是一个可接受的查找结果和嵌套名说明符提名 C类:

- 如果嵌套名说明符之后指定的名称,当用C抬头,是所注入的类名的C (第9节)

的名称,而不是认为是命名的构造类C.

开始声明与注射类名的上下文碰巧是相同外面限定了构造class {}范围,一拉

class Vector3 { … }; 

Vector3::Vector3(){m_x = m_y = m_z = 0.0f;} 

旧GCC注意到该声明不是一个构造函数,然后采取了可行的回退路径。然而,这种回退是非法的,因为C++指定在构造函数可能是查找结果的上下文中,它是唯一有效的查找结果。

在所有可能的情况下,一些用户花时间来提交bug,而GCC开发人员花时间来诊断,修复它并编写一个测试用例。在复杂语言(如C++)中重复使用许多不重要的部分,并开始欣赏放入编译器的努力。