普通班级中的朋友模板功能

时间:2013-01-08 01:36:22

标签: c++ templates friend-function

我认为我需要普通班级中的模板友好功能。这个函数将在共享内存中进行一些复杂的分配,并在硬件和操作系统中进行其他一些操作。但我排除了所有这些,以表明问题与-template-和/或-friend-方面有关,而不是更多的sinsiter。主要部分是我需要类的实例,并且它的成员数据都被分配了一个我可以作为泛型参数传递的分配器。

class Foo    {
public:
    const long * const larry;
    const long * const curly;
    const long * const moe;
private:
    Foo() : larry(0), curly(0), moe(0) {}; // not used

    Foo(long * _larry, long * _curly, long * _moe) :
        : larry(_larry), curly(_curly), moe(_moe)
    {
        // some unrelated memory management and OS stuff happens here
    }

    template<class Alloc> friend const Foo * alloc_Foo(long count);

public: // factories

    template<class Alloc> const Foo * factory_A(long);
//  template<class Alloc> const Foo * factory_B(long);
// ...
//  template<class Alloc> const Foo * factory_G(long);

};

template<class Alloc> const Foo * alloc_Foo(long count)
{
    typename Alloc::template rebind<long>::other a_long;
    // allocate internal parts in shared memory
    const long * const larry = a_long.allocate(count+2);
    const long * const curly = a_long.allocate(count+44);
    const long * const moe   = a_long.allocate(count*3);

    Alloc alloc;
    const Foo * const p_foo = alloc.allocate(1);
    alloc.construct(p_foo, Foo(larry, curly, moe));
);

我认为这应该是正确的解决方案。只有alloc_Foo应该调用构造函数,只有工厂方法应该调用alloc_Foo。 Foo的实例及其单独分配的内部部件在共享内存中创建,它们应该是,并且所有复杂的分配内容都隐藏在alloc_Foo朋友模板中。这部分我可以很好地工作。我甚至不介意在同一个文件中使用alloc_Foo,因为它简短而简单。但是调用alloc_Foo的工厂庞大而复杂,并且会混乱一个干净简单的类,包含数十个包含和数百行代码。

我试图在最后包含这些实现,因此我可以将每个工厂放在一个单独的文件中。

#include "factory_A.tpp"
#include "factory_B.tpp"
// etc.

然后在.tpp文件中我放了实际代码,但我似乎无法包含任何东西,比如说bar.h。 #include规则似乎崩溃了。我担心它与我的模板分配器朋友有关。我肯定不想失去它,因为它解决了我的许多其他问题。

../blah/blah/factory_A.tpp:10:9: error: 'Bar' was not declared in this scope
make: *** [blah/blah/main.o] Error 1

通常情况下,我不会那么盯着范围交易但这对我来说是一个不寻常的组合。也许我正在推翻整个协议。我认为alloc_Foo必须是朋友,所以它可以看到我隐藏的构造函数。我认为它也应该是私人的,只有工厂应该能够使用它。我认为分配器和工厂实际上都不是函数的一部分。他们没有或不需要'这个'。也许他们应该是静态的。我认为它必须是一个模板,因为我需要在许多内部部件上使用特殊的分配器,并为每个实例使用实际的对象本身。它应该是静态的。

有人可以帮忙吗?

感谢。

1 个答案:

答案 0 :(得分:0)

我确信这与模板或朋友无关。预处理器知道关于模板或朋友的 nothing ,它只是打开文件并将其内容插入到其他文件中,模板和朋友不可能“使包含规则分崩离析”。你正在做什么应该没事。

检查bar.h上的包含警戒,它们是否与其他文件相同?

在某些命名空间范围打开时,您#include "factory_A.tpp"了吗?尝试在文件底部的额外包含之前关闭命名空间。

或者Bar在某个命名空间中,您应该说x::Bar

你选错了bar.h吗?尝试将头文件重命名为其他内容,区别于不会调用其他标头的内容,并将#include更改为该内容。

如果这些都不起作用,请将代码缩减为最小的完整示例,以重现问题。目前你没有显示足够的代码来查看真正的问题所在,但它几乎肯定不是你所建议的,而是在你没有展示的代码中的其他地方。

相关问题