【问题标题】:Define vs namespaces定义 vs 命名空间
【发布时间】:2012-09-02 19:39:28
【问题描述】:

我有一个代码:

namespace My
{
    #define sptr std::shared_ptr;
}

它被用在很多地方。现在我已将此代码作为库包含到 qt 项目中,但它无法加载,因为它在某处使用 sptr 作为变量名。

我可以修改 Qt 标头并重命名变量,但这在可移植性方面并不好。解决此问题的最佳方法是什么? typedef 不能与模板一起使用。我知道模板化结构的 hack,但我仍然需要用它修改我的代码。

【问题讨论】:

  • 预处理器指令不受命名空间的约束。
  • @jeffamaphone 我知道。现在它给我带来了描述的问题。
  • auto p = std::make_shared<Foo>();。在 C++11 中,您想要明确地说“shared_ptr”的情况应该很少见。
  • @KerrekSB 是的,谢谢,我知道了。但现在它需要重写我的代码。而且我没有时间这样做;)

标签: c++ templates macros typedef


【解决方案1】:
namespace ns {
  template<typename T>
  using sptr = std::shared_ptr<T>;
}

另请参阅@Kerrek SB 对有关此特定用例的问题的评论。

【讨论】:

    【解决方案2】:

    您可以使用以下内容:

      template<typename T>
      struct sptr : std::shared_ptr<T> { };
    

    这是对std::shared_ptr 的简单包装。这适用于 C++2003 和 C++11。

    【讨论】:

    • 您的代码肯定会工作,但如果没有进一步的工作,例如sptr&lt;int&gt;(new int) 将不会。
    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多