类中没有成员名

3
这里是我的代码。
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'

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

5
很多地方缺少分号。 - DeiDei
1
进一步说,在C++中,你需要在class/ struct声明后面加上分号(;)。_@SuperMurloc_ 你的问题长期来看似乎没有用,请删除它。 - πάντα ῥεῖ
1
此外,在 compareMyStruct2 的实现中,MyClass 应该是 MyClass<A,B>,而嵌套类 MyStruct2 不能在 MyClass 外部使用,除非加上 MyClass<A,B>:: - O'Neil
参数可以通过值(声明)或引用(实现)传递。使用const引用会更好。 - O'Neil
我使用一个集成开发环境来编写实际的代码,但是它太长了,所以这只是一个虚拟的例子。对于缺少的分号表示抱歉,我已经修复了它们以及示例中的按引用传递问题。但是我仍然从我的集成开发环境中得到相同的错误信息 :/ - SuperMurloc
1个回答

2
您的问题是尝试在weak_ptr上调用operator->,但它不存在。 weak_ptr实际上不是一个类似指针的对象。它不能被解引用。您可以尝试从中构造一个shared_ptr:如果weak_ptr已过期,则会抛出异常,否则您将获得有效的类似指针的shared_ptr。请注意保留HTML标签。
return (std::shared_ptr<MyStruct2>(e1)->d3 < std::shared_ptr<MyStruct2>(e2)->d3);

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

但你必须知道,当在已过期的weak_ptr上调用.lock()时,会返回空的shared_ptr。你需要测试结果指针不等于nullptr,确保它们之前没有过期,或使用从weak_ptr构造的shared_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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接