【问题标题】:Why can't i use struct nested in a struct as a type to declare variable in a class template? [duplicate]为什么我不能使用嵌套在结构中的结构作为在类模板中声明变量的类型? [复制]
【发布时间】:2015-08-14 11:15:31
【问题描述】:

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

#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 对我的代码没问题,但它无法编译并出现以下两个错误:

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

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

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

【问题讨论】:

标签: c++ class templates struct nested


【解决方案1】:

当编译器第一次通过 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;
    }
};

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 2020-06-26
    • 2011-03-26
    • 2011-11-02
    • 2018-07-16
    • 1970-01-01
    • 2011-08-01
    • 2011-06-03
    • 2018-07-10
    相关资源
    最近更新 更多