Проблема с 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;
}

Вариант в cpp.sh

Код не компилируется и, соответственно, не работает :) . Что я сделал не так?


Ответы (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;
}
→ Ссылка