【问题标题】:Compiler error related to expression involving list of shared_ptr与涉及 shared_ptr 列表的表达式相关的编译器错误
【发布时间】:2018-01-13 04:49:33
【问题描述】:

我有两个模板声明如下:

template<typename T>
class A{
public:
T& getData();
//rest of public
private:
T& data;
//rest of private
};

template<typename T1, typename T2>
class B{
public:
using typAContainter = class std::list<shared_ptr<A<T1>>>;
B(int, T2&);
//rest of public
private:
typeAContainer C;
//rest of private
};

在 B 的构造函数定义中,我使用以下表达式(用于调试):

template<typename T1, typename T2> B<T1, T2>::B(int I, data& rData){

  #ifdef DEBUG
  auto iter = C.begin();
  std::cout << (*(iter).get())->getData() << std::endl;
  #endif

}

对于表达式(*(iter).get())-&gt;getData(),我得到以下编译错误:

error: no member named 'get' in 'std::__1::                   
__list_iterator<std::__1::shared_ptr<A<std::__1::basic_string<char> > >,     void *>'

我的理解是*iter 应该给我一个shared_ptr&lt;A&lt;T1&gt;&gt; 类型的表达式。调用 get() 方法应该会获取一个 A&lt;T1&gt;* 类型的表达式(指向 A&lt;T1&gt; 的指针),然后我尝试使用 -&gt; 运算符调用 getData() 方法。在构造上述表达式时,我也注意了运算符的优先级。

显然,我的理解存在一些缺陷。如果有人能指出这一点,我将不胜感激。

PS

【问题讨论】:

    标签: compiler-errors c++14 shared-ptr stdlist


    【解决方案1】:

    我认为你误读了一些关于 operator precedence 的内容,并且把 *(iter) 中的括号放错了位置。

    表达式*(iter).get() 等于*((iter).get())(这又等于*(iter.get()))。也就是说,您尝试在迭代器上使用 . 成员访问运算符,然后取消引用 get() 返回的内容。这两种方法通常都不起作用。

    iter-&gt;get()(*iter).get()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多