Я разрабатываю проект, который работает с несколькими арифметическими типами. Поэтому я сделал заголовок, в котором определены минимальные требования для определяемого пользователем арифметического типа:
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
. Что-то здесь не так, или я что-то не так понял?