Engineering a minimalist image interface without templates
A few notes about things and stuff (I know, my introductions are always original):


About that comment:

//doesn't STL have a std::prod() ?!?!


The standard library does have a function to compute the accumulated product of a range. It's called std::accumulate. You can use it like this:

int n = std::accumulate(
    std::begin(dimsizes), std::end(dimsizes),
    1, std::multiplies&lt;int&gt;{}
);


Agreed, it's a bit verbose. But the function is quite generic since it may work with any well-formed binary operation. Note that if you are using C++14, you can use std::multiplies&lt;&gt; instead of std::multiplies&lt;int&gt; and let the type be deduced.
Also, you mentioned std::array. If you know for sure that you will only store 4 values and not more, then please, by all means, use an std::array&lt;short, 4&gt; instead of an std::vector&lt;short&gt;.
Your case isn't really consistent. For local variables, the generally accepted practice is to use snake_case everywhere and to drop every capital letter.
Ok, I hate to say this, but void AImg::plusone(std::string cast) without templates really hurts me. I know that you plan to change that later, but the current version still hurts me ç___ç Also, since you're not altering the std::string, it would be better to take a const std::string&amp; parameter instead.
Instead of that:

int AImg::operator()(unsigned int idx);


Array subcript tends to use the... well, the array subcript operator[] instead of the parenthesis. Unless you have to feed it several parameters, in which case operator() is sometimes preferred, but that's not your case.

int AImg::operator[](unsigned int idx);

I don't think that the method setdata really needs a cast from void* to void*:

void AImg::setdata(void* input) { data = input; }