我成功地将一个类传递给了一个模板方法。但是,如果类内部具有结构,则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;
}
答案 0 :(得分:1)
看看你在这里有什么:
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 ++中,如果有问题的类型嵌套在模板参数内,或者取决于对模板类型参数的某些计算,则类型名称称为 dependent 。这里,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
关键字。当你第一次学习模板时,这是一个常见的绊脚石 - 事实上,我记得有同样的问题! - 所以现代编译器开始发出错误消息,明确建议你去做。