VC ++ говорит, что «никакая перегруженная функция не принимает 7 аргументов», я говорю ДА, ЭТО ДЕЛАЕТ! - PullRequest
3 голосов
/ 16 августа 2010

В заголовочном файле моего PDBComponent класса я только что создал новый конструктор для общего количества двух конструкторов:

class PDBComponent {
    public:
        PDBComponent(string name,double min_current,double nom_current,
                     double max_current, EPSCommands* command_ptr, double delay);
        PDBComponent(string name,double min_current,double nom_current,
                     double max_current, EPSCommands* command_ptr, EPSFault* fault_ptr ,double delay);
...

И когда я использую первый конструктор, я не получаю ошибку компиляции. Вот так:

PDBComponent component = PDBComponent("STX"     ,0.1,  0.5,  1.0
        ,new EPSCommands( 1.0, 3.0),0.0);

Однако, когда я использую второй конструктор, я получаю ошибку компиляции ::

PDBComponent component = PDBComponent("STX"     ,0.1,  0.5,  1.0
        ,new EPSCommands( 1.0, 3.0), new EPSFault(EPSFault::OpenCircuit,2.0),0.0);

Ошибка компиляции:

ошибка C2661: 'fs5system :: PDBComponent :: PDBComponent': ни одна перегруженная функция не принимает 7 аргументов

Я подумал, что, возможно, я работал с одним заголовочным файлом, пока компилятор смотрел на другой, поэтому я прокомментировал первый конструктор. Компилятор показал, что он перекомпилировал PDBComponent.cpp, а затем показал ошибку:

ошибка C2511: 'fs5system :: PDBComponent :: PDBComponent (std :: string, double, double, double, fs5system :: EPSCommands *, double)': перегруженная функция-член не найдена в 'fs5system :: PDBComponent'

... что указывает на то, что компилятор действительно ищет правильный заголовочный файл.

Кто-нибудь знает, почему я вижу это поведение?

Я компилирую с Visual Studios C ++.


Больше подсказок:

Я только что добавил следующую строку в определение класса в заголовочном файле:

bool trash() {return true;}

И проверил это с

PDBComponent* component;
component = new PDBComponent("STX"     ,0.1,  0.5,  1.0
        ,new EPSCommands( 1.0, 3.0),0.0);

cout << component->trash() << endl;

в моем основном файле. При компиляции заголовок PDBComponent снова компилируется. Я получаю сообщение об ошибке:

ошибка C2039: «корзина»: не является членом «fs5system :: PDBComponent»

Ответы [ 2 ]

5 голосов
/ 17 августа 2010

Итак, вы получаете ошибку, когда конструктор с 6 параметрами компилируется, когда вы закомментировали его в заголовке - но тот же самый исходный файл, который содержит , вызывает для конструктора? Возможно ли, что для этой компиляции каким-то образом используется другой заголовок (возможно, это связано со странностью скомпилированного заголовка).

Попробуйте использовать параметр /showIncludes («C ++ | Advanced | Show includes» в настройках проекта среды IDE) и / или отключите предварительно скомпилированные заголовки и посмотрите, есть ли у вас какие-либо дополнительные подсказки или улучшенное поведение.

1 голос
/ 17 августа 2010

Мои психические отладочные способности думают, что EPSFault не определено, где вы его там используете, или что этот класс включен в предварительно скомпилированный заголовок (в этом случае этот заголовок необходимо перестроить).

Обратите внимание, что код НЕ является безопасным для исключения, поскольку вы поместили два new s в один оператор - если первый выполняется успешно, а второй выдает std::bad_alloc, то память, выделенная первым, утечка.

...