2015-02-15 18 views
6

Ai đó có thể giải thích làm thế nào để giải quyết cảnh báo quá tải cho make_unique, lỗi xuất phát từ đâu và nó có ý nghĩa gì? nhưng tôi không chắc chắn tại sao tôi nhận được một mã cho mã cụ thể này)? Tôi đang sử dụng C++ 11, do đó tôi sử dụng mẫu được đề xuất từ ​​Herb Sutter.C++ 11/14 make_unique quá tải không thể tin được cho std :: string

Sử dụng nó tôi nhận được lỗi sau:

Error 4 error C2668: 'make_unique' : ambiguous call to overloaded function 

Và di chuột qua tooltip trong visual studio 13 mang lại cho tôi những điều sau với các phương pháp:

function template "std::enable_if<!std::is_array<_Ty>::value, std::unique_ptr<_Ty,std::default_delete<_Ty>>>::type std::make_unique<_Ty,_Types...>(_Types &&..._Args)" 
function template "std::unique_ptr<T, std::default_delete<T>> make_unique<T,Args...>(Args...) 
argument types are: std::string 

Điều thứ hai nên được một sự gọi từ mẫu make_unique

/* Will be part of c++14 and is just an oversight in c++11 
* From: http://herbsutter.com/gotw/_102/ 
*/ 
template<typename T, typename ...Args> 
std::unique_ptr<T> make_unique(Args&& ...args){ 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 

Hàm tạo sẽ được chuyển tiếp đến:

Shader(const std::string& name); 

Mã tạo ra các lỗi

std::string _name = "Shader"; 
std::unique_ptr<Shader> s = make_unique<Shader>(_name); 

Trả lời

3

Cuộc gọi dễ nhầm lẫn vì bạn làmstd::make_unique, như thể hiện bởi các nội dung tooltip bạn trích dẫn. Và ngay cả khi bạn không viết std::, vì bạn đang chuyển một số std::stringargument-dependent lookup kicks in to search that namespace automatically.

Khi bạn nói "Tôi đang sử dụng C++ 11", điều đó không hoàn toàn đúng, vì Visual Studio không cho phép bạn chọn chuẩn để viết. Nó chỉ cung cấp cho bạn sự hỗ trợ mới nhất mà nó đã thu thập cho bất kỳ tính năng nhất định. Và, rõ ràng, Visual Studio 2013 có C++ 14 của std::make_unique.

Xóa tài khoản của bạn.

+0

Good catch. Nhưng câu hỏi còn lại là tại sao VS thấy cả hai là ứng viên. OP có thể sử dụng 'using namespace std;'? Đó là một điều OP nên sửa chữa. –

+0

Đó là dự đoán đầu tiên của tôi và tôi đã quét tất cả các tệp để sử dụng không gian tên std; Đáng buồn thay đây không phải là vấn đề: ( Không sử dụng không gian tên cho bất kỳ không gian tên nào nữa, và tôi không hiểu tại sao VS không thấy phương pháp C++ 14 :) Tôi có thiếu gì đó không? không có không gian tên sử dụng nữa? Tôi khá chắc chắn câu trả lời chính nó là chính xác nhưng tôi chờ đợi phê duyệt cho đến khi ai đó tìm thấy hoặc giải thích lý do tại sao phương pháp C++ 14 được sử dụng. – NoxMortem

+1

Ok, câu trả lời chính xác là :: make_unique (_name) giải quyết nó. Vẫn còn có thêm câu hỏi nhỏ tại sao VS không nhìn thấy phương pháp C++ 14 mà không đưa ra không gian tên. Một câu hỏi khác, nếu tôi chỉ đơn giản là sử dụng các phương pháp c + + 14, có một số điều tôi cần phải nhận thức được bên cạnh mà một trong những rõ ràng là cần một trình biên dịch C++ 14 có khả năng để xây dựng các dự án? – NoxMortem

-1

Có vẻ như không thể thực hiện việc này trong studio trực quan.

Đó là lỗi.

Đặt cược tốt nhất của bạn, theo câu hỏi này, How to Detect if I'm Compiling Code With Visual Studio 2008?, tiếp tục sử dụng #ifdefs khác nhau để xử lý các trường hợp studio trực quan vẫn còn quá rác để có thể hỗ trợ các tính năng cơ bản.

Sử dụng:

#if (_MSC_VER == 1500) 
    // ... Do VC9/Visual Studio 2008 specific stuff 
#elif (_MSC_VER == 1600) 
    // ... Do VC10/Visual Studio 2010 specific stuff 
#elif (_MSC_VER == 1700) 
    // ... Do VC11/Visual Studio 2012 specific stuff 
#endif 
+1

Không, nó không phải là một lỗi, và tôi đã cho thấy cách bạn có thể làm điều đó. Bạn đã đọc câu trả lời của tôi chưa? Bạn có phải là người đã bỏ phiếu hôm nay không? Tại sao? –

+0

@LightnessRacesinOrbit Nó là một lỗi. make_unique giải quyết mà không sử dụng nó trên bất kỳ lớp nào trong std ::, ví dụ: make_unique () sẽ vẫn giải quyết bằng cách sử dụng std :: make_unique. Làm thế nào mà không phải là một lỗi? (Lưu ý đặc biệt rằng clang giải quyết điều này một cách chính xác. Nó chỉ là studio trực quan có vấn đề) – Doug

+1

Nếu 'make_unique ()' có lỗi thì đó là một vấn đề khác hoàn toàn_. Đọc lại câu hỏi. Đó là về 'make_unique (_name)' trong đó '_name' là một' std :: string'. ADL đá vào. Đó là hành vi tiêu chuẩn 100%. Điều mà câu hỏi này đặt ra không phải là một lỗi. Nếu bạn đã tìm thấy một lỗi trong _some đoạn code_ khác sau đó tuyệt vời nhưng điều đó không làm cho "đó là một lỗi" một câu trả lời đúng cho câu hỏi này. Nó không phải! –

Các vấn đề liên quan