下面是在VS2008中工作正常的地圖中存儲爲值的類的簡化版本(請注意,所有成員都是私有的):在std :: map中的C++ 11類與私有構造函數的值
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()));
}
這將編譯的w/o在VS2008任何錯誤,但無法對VS2015/C++ 11:
file.cpp(178): error C2664: 'std::_Tree_iterator>>> std::_Tree>::insert(std::_Tree_const_iterator>>>,const std::pair &)': cannot convert argument 1 from 'std::pair' to 'std::pair &&' with [ _Kty=std::string, _Ty=Value, _Pr=std::less, _Alloc=std::allocator> ] and [ _Kty=std::string, _Ty=Value ] file.cpp(178): note: Reason: cannot convert from 'std::pair' to 'std::pair' with [ _Kty=std::string, _Ty=Value ] file.cpp(178): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
如果我將Value拷貝構造函數設爲public,它也會在VS2015中編譯好。
但是這是私人的目的,並且只能用於std :: map和std :: pair。但是,似乎在C++ 11中還需要額外的朋友訪問權限來聲明。這些是哪些?
謝謝。
如果我用'std :: string(「x」)'而不是普通的'char []''調用'make_pair',那麼你的代碼會在VS2015中編譯我的代碼: – Zereges
@Zereges:很奇怪,因爲問題不同。即使我更改爲'std :: string(「x」)'我有同樣的錯誤。讓我改變例子以避免混淆。你確定你所有的構造函數都是私有的嗎? – Zotyi