gpt4 book ai didi

c++ - 转换 std::tr1::shared_ptr 和 std::shared_ptr 具有相同的功能但不同的重载

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:05 29 4
gpt4 key购买 nike

在我目前的项目中,我们同时为 Linux 和 Windows 构建。不幸的是,由于某些平台问题,我们的 MSVC 非常陈旧。我们使用的是 MSVC 2010。而 gcc 我们使用的是相对较新且更智能的版本 4.8 。

下面的代码在 gcc 中编译,但 MSCV 对它唠叨:

template<class T, class U>
std::shared_ptr<T> Cast( const std::shared_ptr<U>& spObject ) // rename from CastTerrainObject
{
return std::dynamic_pointer_cast<T>(spObject);
}

template<class T, class U>
std::tr1::shared_ptr<T> Cast( const std::tr1::shared_ptr<U>& spObject ) // rename from CastTerrainObject
{
return std::tr1::dynamic_pointer_cast<T>(spObject);
}

在我为 std::tr1::shared_ptr 添加第二个重载后,MSVC 开始唠叨。我反复遇到的编译错误:

error C2995: 'std::tr1::shared_ptr<_Ty> Cast(const std::tr1::shared_ptr<_Ty2> &)' : function template has already been defined

And

error C2440: 'initializing' : cannot convert from 'std::tr1::shared_ptr<_Ty> (__cdecl *)(const std::tr1::shared_ptr<_Ty2> &)' to 'std::tr1::shared_ptr<_Ty>'

你们对我的情况有解决方案吗?

最佳答案

让您的 Cast 函数模板采用模板模板参数:

template<typename T, template<class> class SP, class U>
SP<T> Cast2(SP<U> const& sp) {
using std::dynamic_pointer_cast;
using std::tr1::dynamic_pointer_cast;
return dynamic_pointer_cast<T>(sp);
}

demo


为后代留下原始答案。 它在 VC++ 上的格式不正确(尽管它按预期工作),因为没有有效的函数特化。

如果 std::shared_ptrstd::tr1::shared_ptr 是相同的东西(它们在 VC++ 10 上,它们不适合我的),则禁用第二个重载海合会)。

template<class T, class U>
typename std::enable_if<
!std::is_same< std::shared_ptr<T>, std::tr1::shared_ptr<T> >::value,
std::tr1::shared_ptr<T>
>::type
Cast( const std::tr1::shared_ptr<U>& spObject ) // rename from CastTerrainObject
{
return std::tr1::dynamic_pointer_cast<T>(spObject);
}

以下代码在 VC++ 10 和 latest gcc 上编译.不幸的是,它在 VC++10 上的格式不正确(尽管按预期工作)

#include <memory>
#include <type_traits>
#ifndef _WIN32
#include <tr1/type_traits>
#include <tr1/shared_ptr.h>
#endif

template<class T, class U> // rename from CastTerrainObject
std::shared_ptr<T> Cast( const std::shared_ptr<U>& spObject )
{
return std::dynamic_pointer_cast<T>(spObject);
}

template<class T, class U>
typename std::enable_if<
!std::is_same< std::shared_ptr<T>, std::tr1::shared_ptr<T> >::value,
std::tr1::shared_ptr<T>
>::type
Cast( const std::tr1::shared_ptr<U>& spObject ) // rename from CastTerrainObject
{
return std::tr1::dynamic_pointer_cast<T>(spObject);
}

struct B{ virtual ~B(){} };
struct D:B{};

int main()
{
Cast<B>(std::make_shared<D>());
}

demo

您也可以通过 ifdef 消除第二个过载,但我不确定应该检查哪些条件。

关于c++ - 转换 std::tr1::shared_ptr<T> 和 std::shared_ptr<T> 具有相同的功能但不同的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40339560/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com