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

时间:2017-07-17 22:07:34

标签: c++ templates

我成功地将一个类传递给了一个模板方法。但是,如果类内部具有结构,则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;

       }

1 个答案:

答案 0 :(得分:1)

看看你在这里有什么:

   template <class T> bool B::MethodBT(T IO) {
     IO::Input In;   // Error!
     IO::Output Out; // Error!

此处的问题是IO是变量,而不是类型,因此您无法将范围解析运算符应用于它。 IOT的类型是一种类型,因此您可以尝试像这样重写它:

   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关键字。当你第一次学习模板时,这是一个常见的绊脚石 - 事实上,我记得有同样的问题! - 所以现代编译器开始发出错误消息,明确建议你去做。