正在尝试使用模板编译嵌套类



基本上,我想要的是在一个类中有一个全局变量GLOBAL_WRAPPER_TYPE,这样我就可以将任何数据类型存储到它中。到目前为止,我有下面的代码,它可能有错误,但只要你不试图从WRAPPED返回任何东西,它就会编译。

我还想知道我的set函数是否正常工作,是否需要重载=运算符来从WRAPPED类中检索模板类型T。我很难让GLOBAL_WRAPPER_TYPE的"提取"工作,我不确定WRAPPED类中的set()函数是否能完成任务。它进行了编译,但可能会出现运行时错误(尚未运行)。

我确实在代码中遇到了编译器错误。。。

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_TYPEWRAPPER的非静态成员,但它不是WRAPPED的成员,您不能从WRAPPED返回WRAPPER::GLOBAL_WRAPPER_TYPE

您可以将WRAPPER::GLOBAL_WRAPPER_TYPE设置为静态。

注:您的set函数将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++编码风格指南。:)

最新更新