0

boostのtype_traitsを使用しているコードで問題が発生しています。これはコードの非常に複雑な部分ですが、コンパイルエラーが発生する部分を特定できます。

template<const size_t maxLen>
class MyString {
public:
    typedef boost::conditional<(maxLen > 0), char[maxLen+1], std::string> ObjExternal;
};

template <class T>
class APIBase {
public:
    typedef T obj_type;
    typedef typename T::ObjExternal return_type;
};

template <class T>
int edit(const T& field, const typename T::return_type& value)
{
    return 0;
}

int myFunction()
{
    APIBase<MyString<10> > b;
    char c[11];
    return edit(b, c);
}

これにより、次のエラーが発生します。

test.cpp:関数内'int myFunction()':tes.cpp:109:エラー:'edit(APIBase>&、char [11])'の呼び出しに一致する関数がありませんtes.cpp:100:注:候補は:int edit(const T&、const typename T :: return_type&)[with T = APIBase>]

ただし、コードで行を変更すると

char c[11];

MyString<10>::ObjExternal c;

できます。同様に、代わりに行を変更した場合

typedef boost::conditional<(maxLen > 0), char[maxLen+1], std::string> ObjExternal;

typedef char ObjExternal[maxLen+1];

それも機能します。正しく評価されていないように見えるので、boost::conditionalの問題だと思います。私のコードに問題がありますか、またはこの機能を持つためにboost :: conditionalの代わりに使用できる代替手段がありますか?

2番目のオプションを使用することを考えていますが、maxLenを0として使用できませんでした。

4

1 に答える 1

1

条件付き型自体ではなく、typeによって提供されるメンバー typedef を使用する必要があります。conditional

変化する:

typedef boost::conditional<(maxLen > 0),
                           char[maxLen+1],
                           std::string> ObjExternal;

に:

typedef typename boost::conditional<(maxLen > 0),
                                    char[maxLen+1],
                                    std::string>::type ObjExternal;
于 2012-10-11T20:50:39.107 に答える