使用C ++ 11编译时,动态指针强制转换编译错误

时间:2018-02-19 11:39:02

标签: c++11 codeblocks openframeworks

我正在使用C ++语言开发OpenFrameworks的应用程序。 在我的程序中有一行生成动态转换指针

Ref_<ImageUniform> p = o.cast<ImageUniform>();

这是实现cast()函数实现的类

template <typename T>
struct Ref_ : public ofPtr<T>
{
    Ref_() {}
    Ref_(T *t) : ofPtr<T>(t) {}
    Ref_(const Ref_<T>& o) : ofPtr<T>(o) {}
    Ref_(const ofPtr<T>& o) : ofPtr<T>(o) {}

    template <typename TT>
    Ref_<TT> cast() const { return dynamic_pointer_cast<TT>(*this); }
};

当我在没有-std = c ++ 11的情况下进行编译时,它可以工作。 但是,当我放入-std = c ++ 11时,它会打印出一个编译错误,并在此第191行将我引用到OpenFrameworks库的内部文件“ofTypes.h”:

#else
    template<typename Tp1>
    ofPtr(const ofPtr<Tp1>& __r, std::__dynamic_cast_tag)
    : std::shared_ptr<T>(__r, std::__dynamic_cast_tag()) { }
#endif

这也是编译错误

  

...... \ libs \ openFrameworks \ types \ ofTypes.h | 193 |错误:没有匹配函数&gt;用于调用'std :: shared_ptr :: shared_ptr(const&gt; ofPtr&amp;,std :: TR1 :: __ dynamic_cast_tag)“|       #其他           模板           ofPtr(const ofPtr&amp; __r,std :: __ dynamic_cast_tag)           :std :: shared_ptr(__ r,std :: __ dynamic_cast_tag()){}       #ENDIF

1 个答案:

答案 0 :(得分:1)

您应该更新您的OpenFrameworks版本(支持C ++ 11),或者不应该使用C ++ 11编译当前代码。

现在您遇到以下代码

的问题
   template<typename Tp1>
   ofPtr(const ofPtr<Tp1>& __r, std::__dynamic_cast_tag)
   : std::shared_ptr<T>(__r, std::__dynamic_cast_tag()) { }

当您在没有C ++ 11的情况下编译此代码时,shared_ptr的实现取自tr1/memory标头。可以编译代码,因为shared_ptr ctor的版本作为第二个参数__dynamic_cast_tag。当您尝试使用C ++ 11编译代码时,您将收到错误,因为shared_ptr实现取自memory标头(其中没有shared_ptr的ctor,其中__dynamic_cast_tag为第二个参数)。