Error on initialization constexpr compile time array on ibm i 7.3

Viewed 133

Due to specific IO process on ibm i there's requirement of using display file fields IO.

As follows we need compile time structures for display file values.

After looking at constexpr I've decided to try some cpp + templates solution from here.

The final code for my case looks like this:

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.

};

The code above compiles with

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

for both char data_[N]; and std::tr1::array<char, N> data_;

However, when I try to populate instance of constexpr_string like this:

#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;
}

error instantly fails compilation with this message CZP0063(30) The text "constexpr_string" is unexpected. right at the ctor line. For me this looks like compiler can not determine the constexpr keyword in this situation, but why?

Did I messed somewhere in code or this usage just currently unsupported?

Here is the supported features of ibm compiler and the IBM XLC++ supports constexpr as far, as I can deduct from given table.

2 Answers

Given this is tagged as ibm-midrange, I'm not sure the feature set of IBM XLC++ is the proper reference to use. I think you want to be using this instead. In particular if you want to use C++0x features (which are not yet fully supported), you need to compile using LANGLVL(*EXTENDED0X).

For further information, this link shows information on support for ILE C++0x language extensions.

I can't verify this on the ibm-midrange system because I don't have access to the CPP compiler there but I think I've found your issue:

#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;
}
Related