【发布时间】:2016-11-30 23:17:17
【问题描述】:
这是该类的简化版本,它作为值存储在地图中,在 VS2008 中可以正常工作(请注意,所有成员都是私有的):
class Value{
friend class FriendClass;
friend class std::map<std::string, Value>;
friend struct std::pair<const std::string, Value>;
friend struct std::pair<std::string, Value>;
Value() {..}
Value(Value const& other) {..}
... rest members...
};
代码(从 FriendClass 调用,因此可以到达私有构造函数):
FriendClass::func()
{
std::map<const std::string, Value> map;
map.insert(std::make_pair(std::string("x"), Value()));
}
这在 VS2008 中编译没有任何错误,但在 VS2015/C++11 上失败:
file.cpp(178): 错误 C2664: 'std::_Tree_iterator>>> std::_Tree>::insert(std::_Tree_const_iterator>>>,const std::pair &)': 不能从 ' 转换参数 1 std::pair' 到 'std::pair &&' 和 [ _Kty=std::字符串, _Ty=值, _Pr=std::less, _Alloc=std::分配器> ] 和 [ _Kty=std::字符串, _Ty=值 ] file.cpp(178):注意:原因:无法从 'std::pair' 转换为 'std::pair' 和 [ _Kty=std::字符串, _Ty=值 ] file.cpp(178):注意:没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符如果我将 Value 复制构造函数公开,它在 VS2015 中也可以正常编译。
但这是有目的的私有化,并且仅适用于 std::map 和 std::pair。但是,在 C++11 中似乎还需要声明额外的好友访问权限。这些是什么?
谢谢。
【问题讨论】:
-
如果我用
std::string("x")而不是普通的char[]调用make_pair,你的代码会在VS2015中为我编译 -
@Zereges:这很奇怪,因为问题不同。即使我更改为
std::string("x")我也有同样的错误。让我更改示例以避免混淆。你确定你所有的构造函数都是私有的吗?