声明嵌套在模板参数中的类型的变量?
Declaring variables of a type nested inside a template argument?
我成功地将一个类传递到模板方法中。但是,如果类内部有结构,则 c++ 编译器不会将一般类型 T 的参数识别为类,并且不允许使用 :: 运算符访问类中的结构。我厌倦了编码的变体,但它不起作用。请考虑我这样做是为了能够将泛型类(任何类(传递到此方法中,并且我不想在此过程中实例化某个类,否则我不会使用模板:
class IO
{
public:
struct Input
{
double pressure = 100;
};
struct Output
{
double pressure = 110;
};
};
template <class T>
bool B::MethodBT(T IO)
{
IO::Input In;
IO::Output Out;
Out.pressure = In.pressure * 10;
cout << "In Template P= :"<< Out.pressure<<endl;
return true;
}
看看你在这里有什么:
template <class T> bool B::MethodBT(T IO) {
IO::Input In; // Error!
IO::Output Out; // Error!
这里的问题是IO
是一个变量,而不是一个类型,因此不能将范围解析运算符应用于它。IO
的类型,T
,是一种类型,所以你可以从尝试像这样重写它开始:
template <class T> bool B::MethodBT(T IO) {
T::Input In; // Better, but error!
T::Output Out; // Better, but error!
如果是这种情况,恭喜你,你刚刚发现了依赖类型名称!在C++中,如果相关类型嵌套在模板参数中,或者依赖于对模板类型参数的某些计算,则类型名称称为依赖。在这里,T::Input
是一个依赖名称,Input
因为它嵌套在T
中,这是一个模板参数。
要解决此问题,您可以使用typename
关键字,如下所示:
template <class T> bool B::MethodBT(T IO) {
typename T::Input In; // Better!
typename T::Output Out; // Better!
换句话说,In
类型的名称是typename T::Input
.
每当需要使用依赖名称时,都必须在它前面加上typename
关键字。这是您第一次学习模板时常见的绊脚石 - 事实上,我记得有同样的问题!- 所以现代编译器开始发出错误消息,明确建议你去做这个。
相关文章:
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 指针数据类型变量如何包含对象?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 如何为结构类型变量赋值
- 如何将字符类型变量附加到字符串中?
- 共享或私有 openmp 代码中的结构化类型变量
- 有没有办法在 c++ 中制作类型变量?
- 从其他类声明类类型变量会给出 C2143 错误(在"*"之前缺少";")
- 如何检查类中定义的枚举类型变量是否被分配给?
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 是否可以在没有结构的情况下创建新的类型变量?
- 为什么类型变量;不调用默认 CTR
- 如何使用CIN将输入整数值获取到char类型变量中
- 如何为 char** 类型变量提供适当的值,以便将其分配给字符串变量
- 在C++标准中哪里说必须初始化 const 内置类型变量的定义
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- Eclipse CDT 打开声明的自动类型变量
- 如何计算长长类型变量中的位数
- 将自动类型变量初始化为零.这种类型安全吗?