Как я могу инициализировать значение по умолчанию параметра функции CArray <CClass *> с пустым CArray?
Я знаю, что мог бы сделать это лучше сstd::vector
, но приложение, с которым я связываюсь, уже имеет кучуCArray
параметров на множество связанных функций ... и я не буду менять их все в данный момент!
Я просто хочу определить пустойCArray<CClass*>
- массивуказатели вCClass
так проблемане может быть наCClass
конструктор - в качестве значения по умолчанию для параметра функции.
Подход 1
Если я попытаюсь сделать это соператор присваивания а такжеконструктор по умолчанию:
void Function(CArray<CClass*> parameter = CArray<CClass*>());
Я получаю ошибку:
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afxTempl.h(262): error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afx.h(535) : see declaration of 'CObject::CObject'
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afx.h(510) : see declaration of 'CObject'
1> This diagnostic occurred in the compiler generated function 'CArray<TYPE>::CArray(const CArray<TYPE> &)'
1> with
1> [
1> TYPE=CClass *
1> ]
Подход 2
Я также пытался сконструктор копирования:
void Function(CArray<Class*> parameter(CArray<CClass*>()));
Я получил ошибки:
>File.cpp(line X): error C2664: 'FunctionClass::Function' : cannot convert parameter 1 from 'CArray<TYPE>' to 'CArray<TYPE> (__cdecl *)(CArray<TYPE> (__cdecl *)(void))'
1> with
1> [
1> TYPE=CClass*
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
строка X: содержит вызов, предоставляющий параметр функции, как показано:pFunctionClass->Function(parameter);
1> CFunctionClass.cpp (строка Y): ошибка C2511: «void CFunctionClass :: Function (CArray)»: перегруженная функция-член не найдена в «CShoePlaceDoc» 1> с 1> [1> TYPE = CClass * 1>] 1> FunctionClass.h (строка A): см. Объявление «CFunctionClass»
строка Y содержитFunction
заголовок реализации, как показано: `void CFunctionClass :: Function (параметр CArray)1> File.cpp (строка Z): ошибка C2660: «CClassFunction :: Function»: функция не принимает 0 аргументов
строка Z: содержит вызовFunction
без указания параметров, как показано:pClassFunction->Function();
Подход не сработал, но он получил свой путь кзаключение: Невозможно использовать конструктор копирования для назначения значения по умолчанию для параметра функции.
Подход 3
И если я попробую слямбда:
void Function(CArray<CClass*> parameter = [] () -> CArray<CClass*>{ return CArray<CClass*> (); } );
тогда я получу несколько выходных данных этих двух ошибок:
1>FunctionClass.h(line A): error C2440: 'default argument' : cannot convert from '`anonymous-namespace'::<lambda2>' to 'CArray<TYPE>'
1> with
1> [
1> TYPE=CClass*
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>FunctionClass.h(line B): fatal error C1903: unable to recover from previous error(s); stopping compilation
строка A: объявление методалиния B: закрытие}
изFunctionClass
класс, который содержитFunction
методПроисхождение проблемы
Основной причиной проблемы, как представляется, является тот факт, чтоCArray
это класс, производный отCObject
, который объявляет оператор присваивания как закрытый:
class AFX_NOVTABLE CObject
{
//...
private:
CObject(const CObject& objectSrc); // no implementation
void operator=(const CObject& objectSrc); // no implementation
//...
}
Итак, как я могу предоставить пустой массив в качестве значения по умолчанию для параметра?