2015-12-25 4 views
1

Я получаю вопросы компиляции для моего кода:ошибка: нет функции соответствия для вызова «»

#include<iostream> 

using namespace std; 

struct TreeNode { 
    int val; 
    TreeNode *left, *right; 
    TreeNode(int x) : val(x), left(NULL), right(NULL) {} 
}; 

int main(){ 
    pair <TreeNode, int> temp, node; 
    return 0; 
} 

Я не могу перегрузить конструктор структуры, которая не принимает никакого значения.

Ошибка:

/usr/include/c++/4.6/bits/stl_pair.h:100:25: error: no matching function for call to ‘TreeNode::TreeNode()’ 
/usr/include/c++/4.6/bits/stl_pair.h:100:25: note: candidates are: 
../a.cpp:18:2: note: TreeNode::TreeNode(int) 
../a.cpp:18:2: note: candidate expects 1 argument, 0 provided 
../a.cpp:15:8: note: TreeNode::TreeNode(const TreeNode&) 
../a.cpp:15:8: note: candidate expects 1 argument, 0 provided 
make: *** [102_binary-tree-level-order-traversal.o] Error 1 

ответ

1

ошибка говорит, что вам не хватает конструктор без аргументов. При выполнении pair <TreeNode, int> temp, node он будет использовать этот конструктор для инициализации пары, поскольку вы не указали явные значения.

Либо вы предоставляете пустой конструктор, либо предоставляете TreeNode и int конструктору пар.

+0

Можете ли вы объяснить, второй пункт - «обеспечить TreeNode и Int конструктору пар.» с помощью кода. ТИА! –

+1

Пример: 'pair node (TreeNode (43), 12), temp (TreeNode (41), 16);' – Becojo

0

Быстрое решение

Добавить по умолчанию-конструктор в код

struct TreeNode { 
     int val; 
     TreeNode *left, *right; 
     TreeNode(){} // DEFAULT CONSTRUCTOR 
     TreeNode(int x) : val(x), left(NULL), right(NULL) {} //parameterized-constructor 
}; 

int main(){ 
     pair <TreeNode, int> temp, node; // Calls default constructor 
     TreeNode t1; // Calls default constructor 
     TreeNode t2(100); // Calls parameterized-constructor 
     return 0; 
} 

Объяснение:

Если вы не укажете конструктор внутри структуры, существует default конструктор определяется неявно. Следовательно, следующие два определения логически эквивалентны. не

Определение-1:

struct TreeNode { 
     int val; 
     TreeNode *left, *right; 
}; 

Определение-2:

struct TreeNode { 
     int val; 
     TreeNode *left, *right; 
     TreeNode(){} // Default Constructor 
}; 

При указании параметризированный-конструктор, конструктор по умолчанию больше не существует. Итак, вы должны явно добавить конструктор по умолчанию (без параметров)

Следующий оператор (из вашего кода) вызывает конструктор по умолчанию, который больше не присутствует (поскольку вы определили конструктор по умолчанию). Следовательно, вы получаете во время компиляции ошибок ошибки: нет подходящей функции для вызова «TreeNode :: TreeNode()»

pair <TreeNode, int> temp, 

Вы можете это исправить, добавив конструктор по умолчанию для вашего кода, упомянутых в быстром решении.

Проверьте это: Does a c++ struct have a default constructor?

Смежные вопросы