C ++类函数返回类型定义,返回一个类

时间:2013-01-24 02:22:14

标签: c++ syntax g++

我的矢量类看起来像这样:

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 version 4.6.3])。但是,在Mac中,g ++可以编译代码(Mac的g ++编译器是[gcc version 4.2.1])。另外,我在Red Hat linux机器上测试这个语法,它也有效(g ++版本是[gcc版本4.4.6])

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

1 个答案:

答案 0 :(得分:2)

旧的编译器不正确。那里有点意外。

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

  

为了名称隐藏和查找的目的,类(第9条)的inject-class-name也被认为是该类的成员。

深入挖掘,§3.4.3.1/ 2,

  

在查找中,构造函数是可接受的查找结果,并且嵌套名称说明符是指定的   C类:

     

- 如果在C中查找,在嵌套名称说明符之后指定的名称是注入类名   C(第9条)

     

该名称被认为是为C类的构造函数命名。

使用inject-name-name启动声明的上下文恰好与定义class {}范围之外的构造函数相同,la

class Vector3 { … };

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

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

很可能一些用户花时间提交错误,GCC开发人员花时间诊断,修复它并编写测试用例。在C ++等复杂语言中乘以琐碎的数量,您就会开始欣赏编译器所付出的努力。