微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用模板和 const 关键字处理指向类型?

如何解决如何使用模板和 const 关键字处理指向类型?

我想用模板做一个简单的事情,但很惊讶它并不简单。 我有

  • 大小为 9 的数组,假设类型为 const int *

我希望它将它作为对象构造的参数传递,如下所示:

const int * myArray[9];
//filling array;
ObectType<int*> myObject(&myArray[0]);

这里有对象构造函数

template<class T>
class ObjectType
{
public:
   ObjectType(const T * myArray) : myArrayMember(myArray) {};
   const T * myArrayMember;
}

但我收到以下错误

error: invalid conversion from ‘const int**’ to ‘int* const*’ [-fpermissive]
   86 |     ObectType<int*> myObject(&myArray[0]);
      |                                 ^~~~~~~~
      |                                 |
      |                                 const int**

不应该将 const T * 替换为 const int** 吗? 我尽量保持简单,真正的代码更复杂。如果您需要一些信息,请告诉我。

解决方法

当您创建 myObject 时,您将使用参数 T 指定模板参数 int*。当代入构造函数参数 T const * 时,得到 int * const *,这是不正确的。

您需要 Tint const *,并且您需要提供正确的模板参数:

ObjectType<int const *> myObject(&myArray[0]);

或者从 C++17 中,你可以让它推导出来:

ObjectType myObject(&myArray[0]);

正如在 comment by StoryTeller-UnslanderMonica 中提到的,值得指出的是,这个答案中的解释似乎很明显,因为我选择使用“east const”表示法,出于多种原因,我发现它更可取。您可以阅读此Q&A了解更多详情。

在这种情况下,这种表示法的好处是更容易理解模板参数替换的工作原理,并且正确的替换变得更加明显。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。