boost :: type_traits :: conditional中类型特征的编译错误

时间:2012-10-11 20:36:05

标签: c++ templates boost conditional typetraits

我在使用来自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&gt;&amp;,char [11])' tes.cpp:100:注意:候选者是:int edit(const T&amp;,const typename T :: return_type&amp;)[with T = APIBase&gt;]

但是,如果我用代码更改行

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的替代方法可以使用此功能?

我正在考虑使用第二个选项,但是我不能将maxLen用作0。

1 个答案:

答案 0 :(得分:1)

您需要使用conditional提供的成员typedef type,而不是条件类型本身。

变化:

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

为:

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