gcc 4.7 иногда не может использовать параметр шаблона указателя

Полный (не) рабочий пример:

struct s { int i; };

template<const s* _arr>
class struct_array
{
public:
static constexpr auto arr = _arr[0]; // works
template<int >
struct inner // line 9, without this struct, it works
{
};
};

constexpr const s s_objs[] = {{ 42 }};

int main()
{
struct_array<s_objs> t_obj;
return 0;
}

Скомпилировано так:

g++ -std=c++11 -Wall constexpr.cpp -o constexpr

Я получаю работающую программу с gone 4.8.1 от ideone, но 4.7.3 выводит это мне:

constexpr.cpp: In instantiation of ‘class struct_array<((const s*)(& s_objs))>’:
constexpr.cpp:18:30:   required from here
constexpr.cpp:9:16: error: lvalue required as unary ‘&’ operand
constexpr.cpp:9:16: error: could not convert template argument ‘(const s*)(& s_objs)’ to ‘const s*’

Последние две строки повторяются 3 раза. В чем причина, и есть ли способ использовать мой код в gcc 4.7.3?

2

Решение

Мне кажется, это ошибка компилятора.

Я попробовал тебе пример на gcc 4.1.2 (codepad), и вы должны явно отметить переменную как имеющую внешнюю связь (const подразумевает внутреннюю связь, если не указано иное, следующий код — C ++ 03):

struct s { int i; };

template<const s* _arr>
class struct_array
{
public:
static const s arr;
template<int >
struct inner
{
};
};

template<const s* _arr>
const s struct_array<_arr>::arr = _arr[0];

// Notice the 'extern'
extern const s s_objs[] = {{ 42 }};

int main()
{
struct_array<s_objs> t_obj;
return 0;
}

У меня так же работает на gcc 4.8.1 без C ++ 11 включен.

Итак, обходной путь:

менять

constexpr const s s_objs[] = ...;

в

extern const s s_objs[] = ...;

Живой пример здесь.

Если вы хотите, чтобы переменная была членом статического класса, то вы должны указать, что она имеет внешнюю связь:

struct data
{
static const s s_objs[1];
};

extern const s data::s_objs[1] = {{ 42 }};

Это дает мне предупреждение на gcc 4.7, не на 4.8. Также это не компилируется на Rise4Fun. Итак, я не уверен, является ли это чисто стандартным или ошибка в одном из компиляторов.

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector