班级

时间:2016-09-10 16:46:31

标签: c++

所以这是我的代码

MyClass.h:

namespace ns{
  template <typename A, typename B>
  class MyClass{
    struct MyStruct1;
    struct MyStruct2;

    struct MyStruct1{
      /*not important here*/
    };

    struct MyStruct2{
      MyStruct2(std::weak_ptr<MyStruct1> i1, std::weak_ptr<MyStruct1> i2, B i3):d1{i1}, d2{i2}, d3{i3} {};
      std::weak_ptr<MyStruct1> d1;
      std::weak_ptr<MyStruct1> d2;
      B d3;
    };
    //Compare MyStruct2
    static bool compareMyStruct2(std::weak_ptr<MyStruct2>& e1, std::weak_ptr<MyStruct2>& e2);
  };

  template<typename A, typename B>
  bool MyClass<A, B>::compareMyStruct2(std::weak_ptr<MyStruct2>& e1, std::weak_ptr<MyStruct2>& e2){
    return (e1->d3 < e2->d3);
  }
}

当我构建时,编译器告诉我

No member named 'd3' in 'std::_1::weak_ptr<ns::MyClass::MyStruct2'

我不知道为什么。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您的问题是,您试图在operator->上调用weak_ptr,而weak_ptr没有。{/ p>

shared_ptr实际上不是指针式对象。它不能被解除引用。您可以做的是尝试从中构建weak_ptr:如果shared_ptr已过期,您将获得异常,否则您将获得有效的return (std::shared_ptr<MyStruct2>(e1)->d3 < std::shared_ptr<MyStruct2>(e2)->d3); ,这是指针式的宾语。

.lock()

更简单的方法是在weak_ptr上致电return (e1.lock()->d3 < e2.lock()->d3);

.lock()

但是,您必须知道shared_ptr在过期weak_ptr时调用时返回空nullptr。您需要测试结果指针不等于shared_ptr,确保它们未事先过期或使用weak_ptr中的shared_ptr构造函数。

当然,如果你需要更复杂的东西,你应该存储创建的auto p1 = e1.lock(); auto p2 = e2.lock(); if (not (p1 && p2)) throw /*expired pointers*/; // Do stuff here // return p1->d3 < p2->d3; ,而不是每次想要访问对象时都创建它:

Meteor.methods({
'schoolHealth': function() {
var pipeline = [
  {
    "$group": {
      "_id": null,
      "total": { "$avg": "$roomHealth"}
    }
  }
];
Equipment.aggregate(pipeline, function(err, result) {
  if (err) {
    throw err;
    console.log("Error in finding school health average:" + result);
  } else {
    console.log(result[0].total)
    return result[0].total;
  }
});
}
});