Похоже, это может быть неправильно задан оператор копирования классов STACK
, например:
class STACK {
public:
...
STACK& operator=(STACK& right); // copy assign
...
};
в этом случае конструктор копирования требует, чтобы он мог изменить right
, но STACK
, возвращаемый из ARB::MyFunct()
, является временным и не может быть изменен.
Попробуйте изменить конструктор копирования на STACK(STACK const& right)
, чтобы C ++ знал, что вы его не измените.
Если вы используете компилятор, поддерживающий ссылки на R-значения (например, Visual Studio 2010), тогда вы можете определить «конструктор перемещения», а также конструктор копирования:
class STACK {
public:
STACK& operator=(STACK const& right); // copy assign: note 'const'
STACK& operator=(STACK&& right); // move assign: note no 'const', double '&'.
...
};
Это будет вызываться только с временными значениями, которые можно изменять.
Те же правила применяются к конструкторам:
class STACK {
public:
STACK();
STACK(STACK const& right); // copy construct
STACK(STACK&& right); // move construct
STACK& operator=(STACK const& right); // copy assign
STACK& operator=(STACK&& right); // move assign
...
};
int main() {
STACK S = T.MyFunct(p); // move construct S (right side is temporary)
S = T.MyFunct(p); // move assign S (right side is temporary)
STACK K = S; // copy construct K (right side is not temporary)
K = S; // copy assign K (right side is not temporary)
}