声明嵌套在模板参数中的类型的变量?

Declaring variables of a type nested inside a template argument?

本文关键字:类型 变量 参数 嵌套 声明      更新时间:2023-10-16

我成功地将一个类传递到模板方法中。但是,如果类内部有结构,则 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关键字。这是您第一次学习模板时常见的绊脚石 - 事实上,我记得有同样的问题!- 所以现代编译器开始发出错误消息,明确建议你去做这个。