基本上我想要的是有一个全局变量GLOBAL_WRAPPER_TYPE
在一个类中,以便我可以将任何数据类型存储到其中。到目前为止,我有下面的代码可能有它的错误,但只要你不尝试从 WRAPPED
返回任何东西,它就会编译。 .
我还想知道我的 set 函数是否正常工作,我是否需要重载 =
运算符从 WRAPPED
中检索模板类型 T类(class)。我在获取 GLOBAL_WRAPPER_TYPE
的“提取”时遇到了问题工作,我不确定 set()
是否WRAPPED
中的函数类(class)甚至可以完成这项工作。它可以编译,但可能会出现运行时错误(尚未运行)。
我的代码确实遇到了编译器错误...
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;
}
最佳答案
GLOBAL_WRAPPER_TYPE
是 WRAPPER
的非静态成员,但它不是 WRAPPED
的成员,你不能返回 WRAPPER::GLOBAL_WRAPPER_TYPE
来自 WRAPPED。
您可以将 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++ 编码风格指南。 :)
关于c++ - 试图用模板编译嵌套类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17914758/