为什么我不能使用嵌套在结构中的结构作为类型来在 class 模板中声明变量?
Why can't i use struct nested in a struct as a type to declare variable in a class template?
你看,我喜欢结构,所以我将一些结构放在结构中,并尝试在 class 模板中使用这些嵌套结构来声明一些变量。唯一的问题是:它似乎没有按预期工作。这是我的最小示例代码:
#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 对我的代码没问题,但它无法编译并出现以下两个错误:
[Line 20 Column 1] error C2143: syntax error : missing ';' before '*'
[Line 20 Column 1] error C4430: missing type specifier - int assumed. Note: C++ does not
support 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;
}
};
你看,我喜欢结构,所以我将一些结构放在结构中,并尝试在 class 模板中使用这些嵌套结构来声明一些变量。唯一的问题是:它似乎没有按预期工作。这是我的最小示例代码:
#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 对我的代码没问题,但它无法编译并出现以下两个错误:
[Line 20 Column 1] error C2143: syntax error : missing ';' before '*'
[Line 20 Column 1] error C4430: missing type specifier - int assumed. Note: C++ does not support 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;
}
};