Cast custom struct to another template type

template <typename T>
struct Colordata
{
public:
    T *data;
    unsigned long size;
    unsigned long length;

    template <size_t N>
    Colordata(T (&arr)[N])
    {
        length = N;
        size = sizeof(arr);
        T dataArr[length];
        for (int i = 0; i < N; i++)
        {
            dataArr[i] = arr[i];
        }
        data = dataArr;
    }
    template <typename TCast>
    operator TCast() const
    {
        TCast dataCastTmp[length];
        for (int i = 0; i < length; i++)
        {
            dataCastTmp[i] = (TCast)data[i];
        }
        return Colordata<TCast>(dataCastTmp);
    }
};

int main(int argc, char const *argv[])
{
    int arr[] = {12, 434, 54};
    auto a = Colordata<int>(arr);
    auto b = (float)a;
    return 0;
}

When I tried to convert Struct<typename> to Struct<another typename> another typename doesn’t exist. I think so ‘cos I get error in the compiler log:

no matching function for call to «Colordata::Colordata(float [((const Colordata*)this)->Colordata::length])»

Is there any way to casting template struct to template struct?

Answer

There are many problems with this code, but the one you asked about is happening because of the signature of the conversion operator:

    template <typename TCast>
    operator TCast() const

If you try to cast to a Colordata<float> then TCast will be the type Colordata<float>, and not float as the implementation assumes.

The solution is to only allow conversions to other Colordata instantiations:

    template <typename TCast>
    operator Colordata<TCast>() const

Now TCast will be float as desired, and you’re one step closer to correct code.


The other problems are the use of variable-length arrays (not supported in C++), and storing pointers to local variables that outlive their scope leading to undefined behaviour. Use std::vector to make life easier and safer.