Проблема не в том, что объект был выделен определенным образом. Невозможно определить, был ли объект размещен в стеке или в свободном хранилище с учетом только одного указателя, по крайней мере, с помощью любого переносного стандартного средства. Доступ к членам объекта с помощью указателя происходит одинаково как для объектов «стека», так и для объектов «свободного хранилища».
Фактическая проблема заключается в том, что вы передаете неправильный тип в определение переменной Process<>
во втором фрагменте:
Process <Sample <double> *> a;
Взгляните на определение Process<>
:
template <typename Item>
class Process
{
public:
void process (Item *item)
{ /* ... */ }
};
Если Item
имеет тип Sample <double> *
, то сигнатура функции для process()
становится:
void process (Sample <double>** item)
{ /* ... */ }
По-видимому, это не то, что вы хотите.
Чтобы это исправить, измените
Process <Sample <double> *> a;
до
Process <Sample <double> > a;
В последнем случае сигнатура функции для process()
становится void process (Sample <double>* item)
, что должно позволить компилировать оба ваших фрагмента кода.