[英]Trying to compile a nested class with a template?
Basically what I want is to have a global variable GLOBAL_WRAPPER_TYPE
within a class so that I can store any data type into it. 基本上,我想要的是在一个类中有一个全局变量
GLOBAL_WRAPPER_TYPE
,以便可以在其中存储任何数据类型。 So far I have the code below which may have its faults but it compiles as long as you don't try to return anything from WRAPPED
. 到目前为止,我下面的代码可能有错误,但是只要您不尝试从
WRAPPED
返回任何内容,它就可以编译。
I also wondered if my set function works properly and do I need to overload the =
operator to retrieve the template type T from the WRAPPED
class. 我也想知道我的set函数是否正常工作,是否需要重载
=
运算符才能从WRAPPED
类中检索模板类型T。 I was having trouble getting the "extraction" of the GLOBAL_WRAPPER_TYPE
to work and I don't know for sure if the set()
function inside the WRAPPED
class even does the job. 我在使
GLOBAL_WRAPPER_TYPE
的“提取”正常工作时遇到了麻烦,而且我不确定WRAPPED
类中的set()
函数是否能完成工作。 It compiles but runtime errors might occur (haven't run it yet). 它可以编译,但是可能会发生运行时错误(尚未运行)。
I did get a compiler error with the code... 我的代码确实出现了编译器错误...
nested_class_global_template.cpp|44|error: invalid use of nonstatic data member 'WRAPPER<NODE>::GLOBAL_WRAPPER_TYPE'|
Due to line 62 NODE temp = WRAPPING.INSIDE.get();
由于第62行,
NODE temp = WRAPPING.INSIDE.get();
but the code does compile without that line, I'm just unsure the set()
function works. 但是代码可以在没有该行的情况下进行编译,我只是不确定
set()
函数是否起作用。
And finally I wanted to know how NODE*
declared as a pointer would screw everything up seeing that its not static? 最后,我想知道将
NODE*
声明为指针是什么,因为看到它不是静态的会把一切搞砸了?
Heres the code. 这是代码。
#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;
}
EDITED this one works! 编辑这一作品!
#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;
}
GLOBAL_WRAPPER_TYPE
is a non-static member of WRAPPER
but it's not a member of WRAPPED
, you can't return WRAPPER::GLOBAL_WRAPPER_TYPE
from WRAPPED. GLOBAL_WRAPPER_TYPE
是WRAPPER
的非静态成员,但不是WRAPPED
的成员,不能从WRAPPED返回WRAPPER::GLOBAL_WRAPPER_TYPE
。
You can either make WRAPPER::GLOBAL_WRAPPER_TYPE
static. 您可以使
WRAPPER::GLOBAL_WRAPPER_TYPE
静态。
Note: Your set function sets GLOBAL_WRAPPER_TYPE
to itself, not set to WRAPPER::GLOBAL_WRAPPER_TYPE
注意:您的set函数将
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!!!
}
Update from comment, you could make GLOBAL_WRAPPER_TYPE
static member: 从评论更新,您可以将
GLOBAL_WRAPPER_TYPE
静态成员:
template <class T>
class WRAPPER
{
public:
static T GLOBAL_WRAPPER_TYPE;
//......
};
template <class T>
T WRAPPER<T>::GLOBAL_WRAPPER_TYPE;
Now you could access WRAPPER::GLOBAL_WRAPPER_TYPE directly. 现在,您可以直接访问WRAPPER :: GLOBAL_WRAPPER_TYPE。
void set(T GLOBAL_WRAPPER_TYPE)
{
WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
}
Note: your variable names are very hard to read, better choose something better. 注意:您的变量名很难读,最好选择更好的名称。 Find a good C++ coding style guilde.
找到一个好的C ++编码样式。 :)
:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.