Ben gibi kod biraz varsa:std :: niteleyici ad alanı işlevi mevcut olduğunda gerekli mi?
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()
}
}
Ben std::sqrt
kullanmak işaretli çizgi değişti sürece o zaman derlemek olmaz. Niye ya? myNamespace
numaralı telefondan sqrt(float)
'u yeniden tanımlamayı denediysem, standart kitaplık sürümünü kullanmak istediğimde std::
ile kalifiye olmam gerektiğini anlıyorum. Derleyici, başka bir (std
) ad alanındaki bir işlevi kullanmak yerine myFloat
'u dönüştürmeyi deniyor gibi görünüyor. Bunu aşmanın bulundu
bir yolu std
ad alanında sqrt(vector<float>)
tanımlamaktır ama bu pek doğru gelmiyor ve this question cevapları std
yılında aşırı yasadışı gösteriyor. Muhtemelen o zaman gitme yolu yok ...
sqrt
(veya başka herhangi bir standart kitaplık cmath işlevi, bu konu için) aşırı yükleyebilirim, böylece derleyicinin hangisini kullanacağına ve derleyiciye sahip olmam gerekmeyecek Geçilen işlev parametrelerini temel alarak seçin?
Teşekkürler.
olduğunu. Küresel isim alanında onu * ilan edebilirdiniz, çünkü bir sebepten dolayı std'yi terk ettiniz. Veya 'sqrt'unuzun yanında, ad alanınıza std :: sqrt;' kullanarak ekleyebilirsiniz. İsmi doğru olarak nitelendiririm. –
Ayrıca, 'namespace somomingsomething' kullanarak da kullanamazsınız ve her zaman std :: prefix'i kullanabilirsin, bu şekilde tamamen saçmalıktan kaçının. – Cubic