Я хочу установить длину массива равной минимуму константы и универсального типа:
template <int foo> struct Bar{
void my_func( int const (&my_array)[std::min(5, foo)] ) { /*...*/ }
};
Этот код компилируется с использованием clang ++, но не g ++, и мне нужен мой код для работы с обоими. Ошибка g ++ дает: error: array bound is not an integer constant before ']' token
. Как я могу установить длину этого массива, чтобы быть минимумом foo
и 5?
Когда я использую clang ++, я сталкиваюсь с проблемой, что не могу связать что-либо с my_array
. Я хочу запустить что-то вроде:
int main() {
static const int var[5] = {0,1,2,3,4};
Bar<5> bar;
bar.my_func(var);
}
Но когда я пытаюсь скомпилировать этот код в clang ++, я получаю: error: reference to type 'const int [*]' could not bind to an lvalue of type 'const int [5]'
.
Если я избавлюсь от std::min()
и заменю его на foo
, код скомпилируется и будет работать нормально.
Примечания:
Чтобы получить этот код для компиляции, вам потребуется #include <algorithm>
или аналогичный для доступа std::min
.
Я не думаю, что это должно быть частью шаблона, но когда я пробую похожие вещи с не шаблонной функцией, такой как:
const int const_five = 5;
void new_func( int const (&my_array)[std::min(5,const_five)] ) { /*...*/ }
g ++ говорит: error: variable or field 'new_func' declared void
, а clang ++ говорит candidate function not viable: no known conversion from 'const int [5]' to 'const int [std::min(5, const_five)]' for 1st argument
, что похоже на одинаковые проблемы.