我试图制作一些可以读取或写入不同类型的文件流。除了具体方法的阅读部分之外,一切都有效。该方法在调用时返回std::unique_ptr<T>
,并且是另一种返回T
的方法的“包装器”。出于某种原因,编译器不使用此方法,而是尝试使用另一种方法(返回T
)编译它。因为这个编译失败。我已经尝试过在互联网上搜索,但我找不到任何准确的答案。你能帮我解决这个问题吗?具有相同名称但返回类型不同的C++模板函数
两种方法我已经定义:
template <typename T>
T read()
{
T obj;
obj.readFromFile<T>();
return std::move(obj);
}
和
template <
typename T,
template<typename> class D,
template<typename, typename> class Container
>
typename std::enable_if_t<
std::is_same<Container<T, D<T>>, std::unique_ptr<T, D<T>>>::value,
Container<T, D<T>>
>
read()
{
return std::move(std::make_unique<T, D<T>>(readFromFile<T>()));
}
后一种方法是,我试图调用一个。
当我写的东西是这样的:
std::unique_ptr<A> AfromFile = fileStreamer.read<std::unique_ptr<A>>()
编译器试图与第一种方法(template <typename T> T read() {...}
)和编译失败编译它。如果我首先制作了unique_ptr object
,并且将它复制到*unique_ptr<A> object
,但是这对我来说并不合适,因为我在这两个函数上使用了一些宏,并且我无法在调用宏之前使对象A自己成为unique_ptr<A> object
。仅供参考,我正在使用Visual Studio 2015.
有什么方法可以使这项工作没有任何重大修改?我还发现一个建议,基本上说你必须给一个函数添加一个指针参数,然后用static_cast<Obj>(nullptr)
作为参数来调用它,但这不算在我的例子中。
感谢您的帮助。
更新: 我只想作出发言,下面所有的解决方案所做的工作对我来说不过来解决我的问题的解决方案通过提供巴里最简单的方法。 Thx再次帮助我!
你将不得不调用'fileStreamer.read ,性病::的unique_ptr>()'... – Jarod42
你说得对,确实是我调用这个方法用错了号码的参数。在我提出正确的参数数量后,代码编译 – Bected