Ошибка при инициализации массива компиляции constexpr на IBM I 7.3 - PullRequest
0 голосов
/ 12 ноября 2018

Из-за специфического процесса ввода-вывода в ibm i существует требование использования полей ввода-вывода для файла ввода-вывода.

Как показано ниже, нам нужно скомпилировать временные структуры для отображения значений файла.

После просмотра constexpr я решил попробовать какое-то решение cpp + templates из здесь .

Окончательный код для моего случая выглядит так:

MYSRC / MYMOD.CPP

#include "MYSRC/MODINCH"

template <int N>
constexpr_string<N> make_constexpr_string(const char(&a)[N]) {
    // Provide a function template to deduce N           ^ right here
return constexpr_string<N>(a);
    //                     ^ Forward the parameter to the class template.
};
int main(int argc, char** argv)
{
    return 0;
}

MYSRC / MODINCH.H

#include <algorithm>

   #define __IBMCPP_TR1__ 1
#include <QSYSINC/STD(array)>

 using std::size_t;

template <size_t N> // N is the capacity of my string.
class constexpr_string {
private:
    //std::tr1::array<char, N> data_; // Reserve N chars to store anything.  
    char data_[N];
    std::size_t size_;         // The actual size of the string.
public:
    constexpr constexpr_string(const char(&a)[N]): data_{}, size_(N - 1)
    {
        for (std::size_t i = 0; i < N; ++i) {
            data_[i] = a[i];
        }
    }
    constexpr iterator begin() {  return data_;   }       // Points at the beggining of the storage.
    constexpr iterator end() {  return data_ + size_;   } // Points at the end of the stored string.

};

Код выше компилируется с

CRTCPPMOD MODULE(QTEMP/MYMOD) SRCFILE(MYLIB/MYSRC) SRCMBR(MYMOD)
OPTIMIZE(40) DBGVIEW(*ALL) LANGLVL(*EXTENDED0X)

для char data_[N]; и std::tr1::array<char, N> data_;

Однако, когда я пытаюсь заполнить экземпляр constexpr_string следующим образом:

#include "MYSRC/MODINCH"

template <int N>
constexpr_string<N> make_constexpr_string(const char(&a)[N]) {
    // Provide a function template to deduce N           ^ right here
return constexpr_string<N>(a);
    //                     ^ Forward the parameter to the class template.
};
int main(int argc, char** argv)
{
auto test1 = make_constexpr_string("blabla");
constexpr_string<7> test("blabla");
return 0;
}

ошибка мгновенно завершается компиляцией с этим сообщением CZP0063(30) The text "constexpr_string" is unexpected. прямо на линии ctor. Для меня это выглядит как компилятор не может определить ключевое слово constexpr в этой ситуации, но почему?

Я что-то напутал в коде или это использование в настоящее время не поддерживается?

Здесь - это поддерживаемые функции компилятора ibm, а IBM XLC ++ поддерживает constexpr, насколько я могу вычесть из данной таблицы.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Я не могу проверить это в системе ibm-midrange, потому что у меня нет доступа к компилятору CPP, но я думаю, что нашел вашу проблему:

#include "MYSRC/MODINCH"
template <int N>
constexpr_string<N> make_constexpr_string;  // <------ You are missing this semicolon
...
int main(int argc, char** argv)
{
    auto test1 = make_constexpr_string("blabla");
    constexpr_string<7> test("blabla");
    return 0;
}
0 голосов
/ 12 ноября 2018

Учитывая, что это помечено как ibm-midrange, я не уверен, что набор функций IBM XLC ++ является подходящей ссылкой для использования. Я думаю, что вы хотите использовать this вместо этого. В частности, если вы хотите использовать функции C ++ 0x (которые еще не полностью поддерживаются), вам нужно скомпилировать, используя LANGLVL(*EXTENDED0X).

Для получения дополнительной информации, эта ссылка показывает информацию о поддержке расширений языка ILE C ++ 0x.

...