C++:私有方法返回的本地 typedef

C++: Local typedef returned by a private method

下面的代码不正确,我明白为什么,get_point returns 一个在 class:

之外类型未知的值
class C {
    typedef std::pair<double, double> Point;
 public:
    Point get_point() const;
};

Point C::get_point() const {
    [...]
}

但为什么下面的代码不正确?本地类型不在 class!

之外使用
class C {
    typedef std::pair<double, double> Point;
 private:
    Point get_point() const;
};

Point C::get_point() const {
    [...]
}

当我们使用C::时,我们应该在class里面,所以我们应该可以使用Point!

这是一个有效的代码。这是一个演示程序

#include <iostream>
#include <utility>

class C 
{
    typedef std::pair<double, double> Point;
    Point p { 10.10, 20.20 };
 public:
    Point get_point() const;
};

C::Point C::get_point() const { return p; }

int main() 
{
    C c;

    auto p = c.get_point();

    std::cout << p.first << ' ' << p.second << std::endl;

    std::pair<double, double> p2 = c.get_point();

    std::cout << p2.first << ' ' << p2.second << std::endl;
}

程序输出为

10.1 20.2
10.1 20.2

您不仅可以使用名称 C::Point 作为类型 std::pair<double, double> 的别名。

至于这段代码

class C {
    typedef std::pair<double, double> Point;
 private:
    Point get_point() const;
};

Point C::get_point() const {
    [...]
}

那你得写

C::Point C::get_point() const {

在定义 class 的范围内搜索在 class 定义之外定义的 class 成员函数的 return 类型的非限定名称。而且没有名字点。您必须使用限定名称。

函数 C::get_point() 的定义在全局范围内,而 Point 不是,因此您必须指定 Point 所在的位置。如果将定义移动到 class 中,则在使用 Point:

时不必指定 typedef (C::) 的范围
class C {
    typedef std::pair<double, double> Point;
public:
    Point get_point() const {
        return Point( 1.0, 2.0 );
    }
};

作为问题的简要回答(在其他回答中有详细说明),在定义中;

Point C::get_point() const {
  //...
} 

需要;

C::Point C::get_point() const {
  //...
} 

这样就找到了C范围内的Point

值得注意的是,如果typedef是private,类型的名称(即Point)就不能在外面使用的 class。客户端代码将需要使用 auto(或以其他方式指定类型)。

根据以下示例;

class C {
    typedef std::pair<double, double> Point;
public:
    Point get_point() const;
};

C::Point C::get_point() const {
    return Point(); // dummy code to compile sample
}

int main()
{
    C c;
    //C::Point a = c.get_point(); // fails to compile (would compile if Point typedef was public
    auto a = c.get_point(); // compiles
}