Wusiki Jeronii
Wusiki Jeronii

Reputation: 171

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?

Upvotes: 0

Views: 474

Answers (1)

Thomas
Thomas

Reputation: 182000

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.

Upvotes: 2

Related Questions