【问题标题】:Declaring variables of a type nested inside a template argument?声明嵌套在模板参数中的类型的变量?
【发布时间】:2017-07-17 22:07:34
【问题描述】:

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

       }

【问题讨论】:

  • 你需要写T::Input,但它可能需要typename T::Input
  • 提示:类 C++中的结构,反之亦然。
  • 我在您的代码中没有看到任何模板。

标签: c++ templates


【解决方案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 关键字。当您第一次学习模板时,这是一个常见的绊脚石 - 事实上,我记得有同样的问题! - 因此,现代编译器开始发出错误消息,明确建议您执行此操作。

【讨论】:

  • 嗨,我刚改成T::Input In;和 T::Output 输出;它现在正在工作。我使用了模板 所以我想我的类型名是可能不需要添加的类。感谢您的快速回复。
  • 答案已更新。这应该可以解决您看到的问题,除非您在原始问题中没有提到其他事情。
  • 有效!再次感谢!
猜你喜欢
  • 1970-01-01
  • 2014-03-31
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
相关资源
最近更新 更多