Nếu tôi có một chút mã như:std :: vòng loại cần thiết khi chức năng không gian tên quá tải tồn tại?
using namespace std;
namespace myNamespace
{
vector<float> sqrt(vector<float> v) { return v; }
void func()
{
vector<float> myVec = { 1, 2, 3, 4 };
std::cout << sqrt(myVec)[0] << std::endl;
float myFloat = 4.0f;
std::cout << sqrt(myFloat) << std::endl; // need to use std::sqrt()
}
}
thì nó sẽ không biên dịch, trừ khi tôi đã thay đổi dòng đánh dấu để sử dụng std::sqrt
. Tại sao? Tôi hiểu rằng nếu tôi cố gắng xác định lại sqrt(float)
trong myNamespace
thì tôi phải đủ điều kiện với std::
nếu tôi muốn sử dụng phiên bản thư viện chuẩn. Trình biên dịch xuất hiện để cố gắng chuyển đổi myFloat
thay vì chỉ sử dụng một hàm trong không gian tên khác (std
).
Một cách mà tôi nhận thấy là xác định sqrt(vector<float>)
trong không gian tên std
nhưng điều đó không hoàn toàn đúng và câu trả lời cho this question đề xuất quá tải trong std
là bất hợp pháp. Có lẽ không phải là cách để đi sau đó ...
Làm cách nào để quá tải sqrt
(hoặc bất kỳ hàm cmath thư viện chuẩn nào khác). chọn dựa trên các tham số hàm được truyền?
Cảm ơn.
Tuyên bố chức năng của riêng bạn trong 'namespace std' chắc chắn là sai. Bạn * có thể * khai báo nó trong không gian tên chung, vì bạn đã bỏ 'std' trong đó vì một lý do nào đó. Hoặc bạn có thể thêm 'using std :: sqrt;' vào không gian tên của bạn, cùng với 'sqrt' của bạn. Tôi chỉ đủ điều kiện tên đúng. –
Bạn cũng có thể không sử dụng 'sử dụng không gian tên somethingsomething' và luôn luôn sử dụng tiền tố std ::, tránh crap như thế này hoàn toàn. – Cubic