Пытаетесь скомпилировать вложенный класс с шаблоном?
По сути, я хочу иметь глобальную переменную 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++.:)