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);
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. –
Đó 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
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