【问题标题】:decltype of pointer to class accessing its () operator指向访问其 () 运算符的类的指针的 decltype
【发布时间】:2020-12-24 09:41:27
【问题描述】:

我有以下课程

template<class T> class CT
{
  T& operator()(int i,int j) const noexcept
  { return indx[i*N+j]; }
  private:
  T  *indx;
  int N;

};

现在在我的应用程序的某些地方,我有以下内容

CT<double> arr, (...);
(...)
decltype(arr) *alias;
if(usearr)alias = &arr;
(...)


alias(0,0) = 3.0; // Compiler ERROR!

编译器抱怨我通过decltype 访问的对象类型不是函数或函数指针。

如果我在声明alias中删除指针并将该行替换为赋值重载,则问题可以解决

decltype(arr) alias;
if(usearr)alias = arr;

前一种方法有什么问题?

【问题讨论】:

  • 您的代码有语法错误。应该是operator()(&lt;params&gt;)。如果您按值获取参数,则无需申请const。最后,展示完整的代码,而不是让每个人都猜测... 中的内容。
  • 这并没有解决问题,但是当alias 被创建时,它有一个未指定的值。如果代码没有为其分配真实地址或空指针,那么它对alias 所做的任何事情都会引入未定义的行为。更合适的初始化可能是decltype(arr) *alias = usearr ? &amp;arr : nullptr;

标签: c++ c++11 pointers decltype


【解决方案1】:

decltype(arr) 产生arr 的类型,即CT&lt;double&gt;,然后decltype(arr) * 产生类型CT&lt;double&gt; *,这是一个指向CT&lt;double&gt; 的指针,你不能直接调用operator() .

您可以取消引用它,然后像(*alias)(0,0) 一样调用operator()

【讨论】:

    猜你喜欢
    • 2017-07-18
    • 1970-01-01
    • 2011-05-09
    • 2015-12-28
    • 2012-01-19
    • 2023-04-08
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多