以下是我的代码示例:
#include <iostream>
#include <memory>
class Base
{
public:
virtual void name() = 0;
};
using ptr_t = std::unique_ptr<Base>;
class A : public Base
{
A(int x) : n(x) {}
public:
void name() override
{
std::cout << "Test " << n << "\n";
}
template <typename T>
friend ptr_t create(int x);
private:
int n;
};
template <typename T>
ptr_t create(int x)
{
return std::make_unique<T>(x);
}
int main()
{
auto a = create<A>(3);
a->name();
}
起初我认为问题出在从std::unique_ptr<A>
到std::unique_ptr<Base>
的转换中。但这似乎在隔离的代码示例中工作正常,并且根据这个答案也是正确的:
unique_ptr to a base class
如果我使用原始指针而不是唯一指针,上面的代码也可以工作。
有人能解释我所缺少的东西。谢谢。
答案 0 :(得分:2)
请注意,您的朋友功能的签名需要与其实现相匹配:
class A
{
A() {}
template <typename T>
friend T* create();
};
template <typename T>
T* create()
{
return new T;
}
int main()
{
auto a = create<A>();
}
已更新至您的新问题。你需要朋友make_unique,它是访问构造函数的函数。但为什么你需要模板?这对我有用:
#include <iostream>
#include <memory>
class Base
{
public:
virtual void name() = 0;
};
class A final : public Base
{
A(int x) : n(x) {}
public:
void name() override
{
std::cout << "Test :" << n << "\n";
}
friend std::unique_ptr<A> std::make_unique<A>(int& x);
private:
int n;
};
std::unique_ptr<A> create(int x)
{
return std::make_unique<A>(x);
}
int main()
{
auto a = create(3);
a->name();
}