Birden çok aritmetik türüyle çalışan bir proje geliştiriyorum.Neden bazı işlevler <cmath> std ad alanında değil?
user_defined_arithmetic.h:
typedef double ArithmeticF; // The user chooses what type he
// wants to use to represent a real number
namespace arithmetic // and defines the functions related to that type
{
const ArithmeticF sin(const ArithmeticF& x);
const ArithmeticF cos(const ArithmeticF& x);
const ArithmeticF tan(const ArithmeticF& x);
...
}
Beni rahatsız eden olduğunu bu gibi bir kod kullandığınızda:
yüzden bir kullanıcı tanımlı aritmetik türü için asgari gereklilikler tanımlanmaktadır kafayla, yapılanerror: call of overloaded 'sin(ArithmeticF&)' is ambiguous
candidates are:
double sin(double)
const ArithmeticF arithmetic::sin(const ArithmeticF&)
:
#include "user_defined_arithmetic.h"
void some_function()
{
using namespace arithmetic;
ArithmeticF lala(3);
sin(lala);
}
bir derleyici hatası alıyorum
Hiçbir zaman <math.h>
başlığını kullanmamıştım, yalnızca <cmath>
. Bir başlık dosyasında hiç using namespace std
kullanmamıştım.
gcc 4.6 kullanıyorum. *. Ben belirsiz beyanı içeren başlık ne olduğunu kontrol ve olarak çıkıyor:
mathcalls.h: biliyorum
Prototype declarations for math functions; helper file for <math.h>.
...
, <cmath>
<math.h>
içerir, ama bu tarafından beyanları kalkan olmalıdır std ad alanı. Ben <cmath>
başlığına içine kazmak ve bulmak:
cmath.h:
...
#include <math.h>
...
// Get rid of those macros defined in <math.h> in lieu of real functions.
#undef abs
#undef div
#undef acos
...
namespace std _GLIBCXX_VISIBILITY(default)
{
...
Yani Ad std#include <math.h>
sonra başlar. Burada yanlış bir şey mi var, yoksa bir şeyi yanlış anlamış mıyım?
Bazı şeylerde çalışmıyor Söylemeye gerek yok: aritmetik türlerini (ayrılmaz türleri + çift + şamandıra) kullanırken genellikle daha verimlidir (ve ortak) referansla değerden geçmek. Belirli bir sürümü istediğiniz bir işlevi çağırırken, ad alanı X 'kullanarak bir '' ekleme yerine, aramaya hak kazanın. Alternatif olarak * yönergesiyle * kullanabilirsiniz ('arithmetic :: sin' kullanarak). Sonunda, 'typedef' düzenleyerek değişen türlerin tüm yaklaşımı gerçekten kötü bir fikirdir. –
@ DavidRodriguez-dribeas: Teşekkürler! Lütfen bana alternatif bir çözüm önerebilir misin? Ben referans ile geçiş kullanıyorum, çünkü sayı özel bir tip olabilir. Bu, hatta birkaç kilobayt büyük alabilirsiniz demektir. Fonksiyonları sıraladığımda ve std temel fonksiyonlarını satır içi içinde kullandığımda, hiçbir zarar vermeyeceğini umuyordum. Yoksa olacak mı? Bana biraz öneri verebilir misiniz lütfen? –
@ DavidRodriguez-dribeas: C++ yaklaşımının soyut bir sınıf bildirmek olacağını biliyorum, ancak matris hesaplamaları için kullandığım bir kitaplık yerleşik bir tür kullandığınızda önemli optimizasyonlar kullanıyor. Ben sadece bu avantajı kaybetmek istemedim –