我在使用来自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。
答案 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;