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
}
下面的代码不正确,我明白为什么,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
:
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
}