首页 > 解决方案 > 模板实现文件中的匿名命名空间

问题描述

在 .cpp 文件中,匿名命名空间基本上具有文件范围的链接(在#includes 之后),因为 .cpp 文件永远不会被另一个文件包含。但是,头文件中的相同模式将该匿名名称空间传播到包含它的任何位置。有没有办法在头文件中创建类似的效果?我问是因为模板实现必须在标题中。

常规 .h 文件中的一个简单示例如下:

// object.h

namespace {
    using verbose::namespace::type;
}

...

struct object {  
    type value;
}

或类似地在某些模板实现文件中。该类型type将在包含此文件的任何位置的范围内。

有没有解决的办法?

编辑:我想我找到了一个冗长但可行的答案。

// object.h

struct Namespace {
     using verbose::namespace::type;

     Namespace() = delete;

     struct object {
         type value;
     };
};

using Namespace::object;

标签: c++namespaceslinkagetranslation-unit

解决方案


这应该可以解决问题:

// object.h
{
    namespace {
        using verbose::namespace::type;
    }

    ...

    struct object {  
        type value;
    }
}

命名空间应该只在定义它们的代码块内有效。


推荐阅读