Почему некоторые функции в не входят в пространство имен std?

Я разрабатываю проект, который работает с несколькими арифметическими типами. Поэтому я сделал заголовок, в котором определены минимальные требования для определяемого пользователем арифметического типа:

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);
...
}

Что меня беспокоит, так это то, что когда я использую такой код:

#include "user_defined_arithmetic.h"

void some_function()
{
    using namespace arithmetic;
    ArithmeticF lala(3);
    sin(lala);
}

Я получаю ошибку компилятора :

error: call of overloaded 'sin(ArithmeticF&)' is ambiguous
candidates are:
double sin(double)
const ArithmeticF arithmetic::sin(const ArithmeticF&)

Я никогда не использовал заголовок , только заголовок . Я никогда не использовал с использованием пространства имен stdв заголовочном файле.

Я использую gcc 4.6.*. Я проверил заголовок, содержащий неоднозначное объявление, и оказалось:

mathcalls.h :

Prototype declarations for math functions; helper file for <math.h>.
...

Я знаю, что включает , но он должен защищать объявления пространством имен std. Я копаюсь в заголовке и нахожу:

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)
{
...

Итак, пространство имен std начинается после #include . Что-то здесь не так, или я что-то не так понял?

27
задан Martin Drozdik 18 June 2012 в 15:21
поделиться