У меня проблема в некотором коде, использующем type_traits от boost.
Это довольно сложная часть кода, но я мог бы выделить часть, которая приводит к ошибке компиляции:
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: ошибка: отсутствует функция сопоставления для вызова call edit (APIBase>&, char [11]) ’
tes.cpp: 100: примечание: кандидаты: int edit (const T&, const typename T :: return_type&) [с 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.
Вам нужно использовать член typedef type
предоставлено 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;
Других решений пока нет …