我可能过分地想要解决一个本应简单的问题。 我在这里提出了这个问题:
获取编译时基类类型
基本上我试图使类管理自己的指针类型。 我正在包装一个C库,其中一些结构体中嵌入了引用计数,而其他结构体则没有。 对于那些没有引用计数的结构体,我想使用shared_ptr。 对于有引用计数的结构体,我想使用intrusive_ptr。 我想避免依赖程序员的智力来确保使用适当的封装器。 最终,我想添加更多依赖于此行为的功能,但我还没有做到。
@Yakk提出了一种有趣的解决方案,使用模板类型别名,我已经尝试实现它。 不幸的是,我陷入了一个位置,似乎无法满足编译器对循环引用的要求。 我遇到了一个“嵌套名称指定符中命名的不完整类型'Test2'”错误,指向“using pointer =”行。 我也得到了一个奇怪的“定义与返回类型声明不同”的错误,但我认为一旦解决第一个错误,这个问题可能会解决。
我在这种错误类型中找到的大多数参考资料都涉及头文件的排序,但即使所有内容都在一个文件中,我也无法弄清楚如何安排顺序以消除这个问题。
有什么想法吗?
@Yakk提出了一种有趣的解决方案,使用模板类型别名,我已经尝试实现它。 不幸的是,我陷入了一个位置,似乎无法满足编译器对循环引用的要求。 我遇到了一个“嵌套名称指定符中命名的不完整类型'Test2'”错误,指向“using pointer =”行。 我也得到了一个奇怪的“定义与返回类型声明不同”的错误,但我认为一旦解决第一个错误,这个问题可能会解决。
我在这种错误类型中找到的大多数参考资料都涉及头文件的排序,但即使所有内容都在一个文件中,我也无法弄清楚如何安排顺序以消除这个问题。
有什么想法吗?
#include <iostream>
#include <memory>
template<typename T>
class Pointered: public std::enable_shared_from_this<T>
{
public:
using pointer=std::shared_ptr<T>; //<-- incomplete type named error
using weakPointer = std::weak_ptr<T>;
};
template<typename T>
using Ptr = typename T:: pointer;
template<typename T>
using WkPtr = typename T:: weakPointer;
class Test2;
class Test:public Pointered<Test>
{
public:
Ptr<Test2> f();
};
class Test2:public Pointered<Test2>
{
public:
Ptr<Test> p;
Test2(Ptr<Test> ptr):p(ptr){}
};
int main(int argc, const char * argv[])
{
Ptr<Test> p=std::make_shared<Test>();
Ptr<Test> p3=p;
p->f();
std::cout << "Refcount: " << p.use_count() << std::endl;
}
//definition differs from declaration in return type error here
Ptr<Test2> Test::f()
{
return Ptr<Test2>(new Test2((Ptr<Test>)shared_from_this()));
}