c ++包括未命名的命名空间中的头文件

时间:2016-03-15 16:17:29

标签: c++

我在工具包中使用了一个名为Cache的类(具有各种可公开访问的方法的文件)。使用回调刷新缓存,这需要一个仿函数对象。仿函数对象在我的工具箱中调用Cache函数中的一个函数refresh()。

该实例位于工具包中未命名的命名空间内(因为我不希望客户端直接访问它)。

现在,我已经完成了所有工作,但是真的希望Cache拥有自己的头文件,以便明确它上面有哪些方法。

我的问题是我有以下内容:

// toolkit.cxx
#include "cache.h"

// Can't define operator()() here since it needs access the to cache instance
struct Functor {
   void operator() ();
};

// Define Cache's fucntions here (including use of Functor)

namespace {
   Cache cache;

// This gives a compiler error - definition of operator Functor::()() is not in namespace enclosing 'Functor'
   void Functor::operator() () {
      cache.refresh();
   }
}

因此,我无法在未命名的命名空间中定义Functor::operator()(),也无法将其移出。

我考虑过的一个解决方案是将整个批次带入未命名的命名空间,但这也必须包含#include。这是推荐的吗?这不是我以前真正看到的事情(这表明这可能是一个糟糕的计划......),而且我无法找到有关这种方法的利弊的更多信息。

这将是解决方案:

// toolkit.cxx

namespace {
   #include "cache.h"

   Cache cache;

   struct Functor {
     void operator()() {
        cache.refresh();
   };

  // Define Cache's fucntions here (including use of Functor)
}

有人可以评论第二种方法的优点/缺点(特别是缺点)吗?任何替代解决方案也欢迎

1 个答案:

答案 0 :(得分:0)

解决方案1 ​​

在匿名a and b内定义a = [1,2,4,5] and b = [2,3,5,6]

Functor

解决方案2

在定义匿名namespace之后定义#include "cache.h" namespace { Cache cache; struct Functor { void operator() () { cache.refresh(); } }; }

Functor

解决方案3

在匿名namespace之前声明#include "cache.h" namespace { Cache cache; } struct Functor { void operator() () { cache.refresh(); } }; ,但要定义 在定义匿名Functor之后namespace

Functor::operator()