2

クラスconstruct<T>()のメソッドを使用しようとすると、奇妙なコンパイル エラーが発生します。boost::interprocess::managed_shared_memoryBoost ライブラリを 1.48 バージョンで、GCC を 4.6.3 バージョンで使用しています。

問題は、managed_shared_memory object(構造体のメンバーではない) を作成し、そのメソッドを使用してオブジェクトを構築しようとするとconstruct<T>()、コンパイルが成功することです。

#include <boost/interprocess/managed_shared_memory.hpp>
namespace proc = boost::interprocess;

template <typename _T>
void TFunc() {
    proc::managed_shared_memory mem;
    mem = proc::managed_shared_memory(proc::create_only, "mem1", 1024);
    int* ob1 = mem.construct<int>("i1") ();
}

ただし、managed_shared_memoryオブジェクトが構造体内で定義されてから作成されると、メソッドの使用法のコンパイルはconstruct<T>()失敗します:

#include <boost/interprocess/managed_shared_memory.hpp>
namespace proc = boost::interprocess;

template <typename _T>
void TFunc() { 
    struct MemoryHandler {
        proc::managed_shared_memory mem;
    } handler;

    handler.mem = proc::managed_shared_memory(proc::create_only, "mem2", 1024);
    int* ob2 = handler.mem.construct<int>("i2") ();  // failure
}

construct次の GCC エラーで、使用方法の行を指しています。

error: expected primary-expression before 'int'
error: expected ',' or ';' before 'int'

残念ながら、Boost と GCC の別のバージョンに対してはテストしていないので、Boost/GCC のバグなのか機能なのかはわかりません。

誰かが同様のエラーに苦労したり、何が原因であるかを知っていますか?

4

1 に答える 1

1

エラーを示す完全な例を示していないため、推測することしかできませんが、失敗した行はテンプレート内にhandlerあり、依存型であると思われます。

constructこれを修正するには、関数テンプレートであることをコンパイラに伝える必要があります。

int* ob2 = handler.mem.template construct<int>("i2") ();
                       ^^^^^^^^

詳細については、C++ テンプレートに関する FAQを参照してください。

そして次回は、推測させるのではなく、他の人が正確な問題を再現できるように、完全な例を投稿してください。たとえば、同じエラーを示す最小限の完全な例を次に示します。

#include <boost/interprocess/managed_shared_memory.hpp>

namespace proc = boost::interprocess;

struct MemoryHandler{
        proc::managed_shared_memory mem;
} handler;

template<typename T> void f(T handler)
{
  handler.mem = proc::managed_shared_memory(proc::create_only, "mem2", 10);
  int* ob2 = handler.mem.construct<int>("i2") ();  // failure
}
于 2012-10-12T11:40:24.077 に答える