c++ - 试图用模板编译嵌套类?

标签 c++ templates global-variables nested-class

基本上我想要的是有一个全局变量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_TYPEWRAPPER 的非静态成员,但它不是 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/

相关文章:

c - 处理共享对象中的全局变量

Python:如何在模块中使用主文件中的变量?

c++ - 无法使用 square() 函数 c++

c++ - 使用XMVECTOR时内存访问异常

javascript - yeoman/JS : Repeating HTML blocks in a HTML template - compiling to eventually integrate with Wordpress?

c++ - std::forward 和 operator()

lua - 为什么在lua中访问局部变量比全局变量更快?

c++ - #define hell C/C++ 的替代品/工具

c++ - 如何使用 LUA_COMPAT_ALL?

c++ - 从类模板继承模板化构造函数?