Пытаетесь скомпилировать вложенный класс с шаблоном?

По сути, я хочу иметь глобальную переменную GLOBAL_WRAPPER_TYPE внутри класса, чтобы я мог хранить в нем любой тип данных. Пока у меня есть код ниже, который может иметь свои ошибки, но он компилируется, если вы не пытаетесь вернуть что-либо из WRAPPED,

Мне также было интересно, правильно ли работает моя функция set и нужно ли перегрузить = оператор для получения шаблона типа T из WRAPPED учебный класс. У меня были проблемы с получением "извлечения" из GLOBAL_WRAPPER_TYPE работать, и я не знаю точно, если set() функция внутри WRAPPED класс даже делает работу. Он компилируется, но могут возникнуть ошибки времени выполнения (еще не запускали его).

Я получил ошибку компилятора с кодом...

nested_class_global_template.cpp|44|error: invalid use of nonstatic data member 'WRAPPER<NODE>::GLOBAL_WRAPPER_TYPE'|

Из-за линии 62 NODE temp = WRAPPING.INSIDE.get(); но код компилируется без этой строки, я просто не уверен set() функция работает.

И, наконец, я хотел знать, как NODE* объявленный как указатель, все испортит, видя, что это не статично?

Вот код.

#include <iostream>

using namespace std;

class NODE
{
    int data;

    public:

    NODE(){}
    ~NODE(){}
    NODE(int data)
    {
        this->data = data;
    }
    void print()
    {
        std::cout<<"data: "<<this->data<<std::endl;
    }
};
template <class T>
class WRAPPER
{
    public:

     T GLOBAL_WRAPPER_TYPE;

    WRAPPER(){}
    ~WRAPPER(){}

    class WRAPPED
    {
        public:

        WRAPPED(){}
        ~WRAPPED(){}
        void set(T GLOBAL_WRAPPER_TYPE)
        {
            GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
        }
        T& get()
        {
            return GLOBAL_WRAPPER_TYPE;
        }
        WRAPPED& operator=(const WRAPPED &INSIDE)
        {
            GLOBAL_WRAPPER_TYPE = INSIDE.GLOBAL_WRAPPER_TYPE;

            return *this;
        }
    };

    WRAPPED INSIDE;
};
int main()
{
    WRAPPER<NODE> WRAPPING;
    WRAPPING.INSIDE.set(NODE(99));


    NODE temp = WRAPPING.INSIDE.get();

    return 0;
}

Отредактированный это работает!

    #include <iostream>

using namespace std;

class NODE
{
        int data;

    public:

        NODE(){}
        ~NODE(){}
        NODE(int data)
        {
            this->data = data;
        }
        void print()
        {
            std::cout<<"data: "<<this->data<<std::endl;
        }
};
template <class T>
class WRAPPER
{
    public:

        static T GLOBAL_WRAPPER_TYPE;

    WRAPPER(){}
    ~WRAPPER(){}

        class WRAPPED
        {
            public:

            WRAPPED(){}
            ~WRAPPED(){}
            void set(T GLOBAL_WRAPPER_TYPE)
            {
                WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
            }
            T& get()
            {
                return GLOBAL_WRAPPER_TYPE;
            }
            WRAPPED& operator=(const WRAPPED &INSIDE)
            {
                GLOBAL_WRAPPER_TYPE = INSIDE.GLOBAL_WRAPPER_TYPE;

                return *this;
            }
        };

        WRAPPED INSIDE;
};
template <class T>
T WRAPPER<T>::GLOBAL_WRAPPER_TYPE;
int main()
{
    WRAPPER<NODE> WRAPPING;
    WRAPPING.INSIDE.set(NODE(99));
    NODE temp = WRAPPING.INSIDE.get();
    temp.print();

    return 0;
}

1 ответ

Решение

GLOBAL_WRAPPER_TYPE является нестатическим членом WRAPPER но это не член WRAPPED, вы не можете вернуться WRAPPER::GLOBAL_WRAPPER_TYPE от завернутый.

Вы можете сделать WRAPPER::GLOBAL_WRAPPER_TYPE статичный.

Примечание: ваши наборы функций установлены GLOBAL_WRAPPER_TYPE к себе, а не к WRAPPER::GLOBAL_WRAPPER_TYPE

  void set(T GLOBAL_WRAPPER_TYPE)
  {
        GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;  // Doesn't do what you think!!!
  }

Обновление из комментария, вы можете сделать GLOBAL_WRAPPER_TYPE статический член:

template <class T>
class WRAPPER
{
    public:    
     static T GLOBAL_WRAPPER_TYPE;
    //......
};

template <class T>
T WRAPPER<T>::GLOBAL_WRAPPER_TYPE;

Теперь вы можете получить доступ к WRAPPER::GLOBAL_WRAPPER_TYPE напрямую.

 void set(T GLOBAL_WRAPPER_TYPE)
 {
       WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
 }

Примечание: имена ваших переменных очень трудно читать, лучше выберите что-нибудь получше. Найдите хорошую гильду в стиле C++.:)

Другие вопросы по тегам