Ошибка компиляции с типом черты в boost :: type_traits :: conditional

У меня проблема в некотором коде, использующем 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.

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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]