Проблема с using
Хочу локально для класса сделать доступным только одну функцию из пространства имён (у меня в классе около 25 небольших функций, в каждой из которых используется функция из внешнего неймспейса, хочется для всех разом подключить эту функцию), код:
#include <iostream>
namespace nms
{
template<class T>
T sqr(const T &x)
{
return x*x;
}
}
class A
{
using nms::sqr;
public:
int Foo(int x)
{
return sqr(x);
}
};
int main()
{
int x;
std::cin >> x;
A a;
a.Foo(x);
return 0;
}
Код не компилируется и, соответственно, не работает :) . Что я сделал не так?
Ответы (1 шт):
Автор решения: user7860670
→ Ссылка
Директива using не работает в области класса, только в локальной или в пространстве имен. Соответственно тут можно зделать финт и обернуть класс в пространство имен, а потом вынести наружу только имя класса:
// Example program
#include <iostream>
#include <string>
namespace nms
{
template<class T>
T sqr(const T &x)
{
return x*x;
}
}
namespace details
{
using nms::sqr;
class A
{
public: int Foo(int x)
{
return sqr(x);
}
};
}
using details::A;
int main()
{
int x;
std::cin >> x;
// sqr(x); // error
A a;
a.Foo(x);
return 0;
}
Вариант 2: сделать обертку:
#include <iostream>
namespace nms
{
template<class T>
T sqr(const T &x)
{
return x*x;
}
}
class A
{
private: template<class T> static
T sqr(const T &x)
{
return nms::sqr(x);
}
public: int Foo(int x)
{
return sqr(x);
}
};
int main()
{
int x;
std::cin >> x;
A a;
a.Foo(x);
return 0;
}