为什么我不能使用嵌套在结构中的结构作为类型来声明类模板中的变量?

Why can't i use struct nested in a struct as a type to declare variable in a class template?

本文关键字:结构 声明 变量 类型 嵌套 不能 为什么      更新时间:2023-10-16

你看,我喜欢结构体,所以我把一些结构体放在结构体里面,并尝试在类模板中使用这些嵌套的结构体来声明一些变量。唯一的问题是:它似乎没有像预期的那样起作用。这是我的最小示例代码:

#include "stdafx.h"
#include <iostream>
struct T1
{
    struct NESTED
    {
        int var1 = 12345;
    };
};
struct T2
{
    struct NESTED
    {
        float var1 = 67890;
    };
};

template <typename T > class Proletarian
{
public:
    T * t;                                       //works
  //T::NESTED * tn;        ****** doesn't work! *******
    Proletarian<typename T>()
    {
        T::NESTED * tNested = new T::NESTED;     //works
        std::cout << tNested->var1;
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    Proletarian<T1> t1 = Proletarian<T1>();
    Proletarian<T2> t2 = Proletarian<T2>();
    return 0;
}

我使用Visual Studio 2013, Intellisense是ok与我的代码,但它只是不会编译与这两个错误:

[第20行第1列]错误C2143:语法错误:在'*'之前缺少';'

[第20行第1列]错误C4430:缺少类型说明符-假定为int。注意:c++没有支持default-int

我不太擅长c++,所以可能不太明白模板是如何工作的,以及为什么会发生这种情况。

当编译器第一次通过Proletarian -在它看到特定类型T的实例化之前-它需要帮助知道T::NESTED将引用某些类型,您可以使用typename给它,如下所示:

template <typename T>
class Proletarian
{
  public:
    typename T::NESTED* tn;
    Proletarian<T>()
    {
        typename T::NESTED* tNested = new typename T::NESTED;
        std::cout << tNested->var1;
    }
};