所以这是我的代码
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'
我不知道为什么。有什么建议吗?
答案 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;
}
});
}
});