No default constructor for class member that is a template object itself
I'm trying to write a simple class for binary search tree that uses a class of nodes using templates. This is my code:
When I try to compile the code I get this error:'Node<T>': no appropriate default constructor available'
for this line: Tree() : root(0), counter(0) {}
and I don't understand why it would even use a default constructor here I'm just giving a value to a pointer of the class type.
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Node {
public:
Node(const T &value) : value(value), Left(0), Right(0) {}
~Node() {
if (Left != 0)
delete Left;
if (Right != 0)
delete Right;
}
Node& getLeft() { return *Left; }
Node& getRight() { return *Right; }
private:
Node* Left;
Node* Right;
T value;
};
template <typename T>
class Tree : public Node<T> {
public:
template<typename T>
friend ostream& operator<<(ostream& output, const Tree<T> &t);
Tree() : root(0), counter(0) {}
Tree(const T &rootValue) : root(new Node<T>(rootValue)), counter(1) {}
~Tree() { delete root; }
Tree& insert(const T &value) {
Node<T> *runner = root;
Node<T> *replacer = root;
if (runner == 0)
root = new Node<T>(value);
else
{
while (runner != 0)
{
replacer = runner;
if (value > runner->value)
runner = runner->Right;
else
runner = runner->Left;
}
if (value > replacer->value)
replacer->Right = new Node<T>(value);
else
replacer->Left = new Node<T>(value);
}
counter++;
return *this;
}
bool exists(const T &value) const {
Node<T> *runner = root;
while (runner != 0)
{
if (value == runner->value)
return true;
if (value > runner->value)
runner = runner->Right;
else
runner = runner->Left;
}
return false;
}
int size() const { return size; }
private:
Node<T> *root;
int counter;
};
template<typename T>
string preorderToString(const Node<T> &n) { //Function that receives a tree and returns a string of the preorder traversal of it
string left, middle, right;
if (n.Left != 0)
left = preorderToString((*n.Left)) + " ";
middle = to_string(n.value);
if (n.Right != 0)
right = " " + preorderToString((*n.Right));
return left + middle + right;
}
template<typename T>
ostream& operator<<(ostream& output, const Tree<T> &t) //Operator overloading that uses the function 'preorderToString' to print the tree contents
{
return output << preorderToString<T>(*(t.root));
}
int main() {
Tree<double> test;
}
c++ templates constructor initialization default
add a comment |
I'm trying to write a simple class for binary search tree that uses a class of nodes using templates. This is my code:
When I try to compile the code I get this error:'Node<T>': no appropriate default constructor available'
for this line: Tree() : root(0), counter(0) {}
and I don't understand why it would even use a default constructor here I'm just giving a value to a pointer of the class type.
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Node {
public:
Node(const T &value) : value(value), Left(0), Right(0) {}
~Node() {
if (Left != 0)
delete Left;
if (Right != 0)
delete Right;
}
Node& getLeft() { return *Left; }
Node& getRight() { return *Right; }
private:
Node* Left;
Node* Right;
T value;
};
template <typename T>
class Tree : public Node<T> {
public:
template<typename T>
friend ostream& operator<<(ostream& output, const Tree<T> &t);
Tree() : root(0), counter(0) {}
Tree(const T &rootValue) : root(new Node<T>(rootValue)), counter(1) {}
~Tree() { delete root; }
Tree& insert(const T &value) {
Node<T> *runner = root;
Node<T> *replacer = root;
if (runner == 0)
root = new Node<T>(value);
else
{
while (runner != 0)
{
replacer = runner;
if (value > runner->value)
runner = runner->Right;
else
runner = runner->Left;
}
if (value > replacer->value)
replacer->Right = new Node<T>(value);
else
replacer->Left = new Node<T>(value);
}
counter++;
return *this;
}
bool exists(const T &value) const {
Node<T> *runner = root;
while (runner != 0)
{
if (value == runner->value)
return true;
if (value > runner->value)
runner = runner->Right;
else
runner = runner->Left;
}
return false;
}
int size() const { return size; }
private:
Node<T> *root;
int counter;
};
template<typename T>
string preorderToString(const Node<T> &n) { //Function that receives a tree and returns a string of the preorder traversal of it
string left, middle, right;
if (n.Left != 0)
left = preorderToString((*n.Left)) + " ";
middle = to_string(n.value);
if (n.Right != 0)
right = " " + preorderToString((*n.Right));
return left + middle + right;
}
template<typename T>
ostream& operator<<(ostream& output, const Tree<T> &t) //Operator overloading that uses the function 'preorderToString' to print the tree contents
{
return output << preorderToString<T>(*(t.root));
}
int main() {
Tree<double> test;
}
c++ templates constructor initialization default
Note that your don't respect rule of 5/3/0, you should probably implement your smart pointer if you cannot use std ones.
– Jarod42
Jan 3 at 17:26
You can usenullptr
to represent null pointers after c++11, and this will help others to understand your code better.
– hare1039
Jan 3 at 19:51
add a comment |
I'm trying to write a simple class for binary search tree that uses a class of nodes using templates. This is my code:
When I try to compile the code I get this error:'Node<T>': no appropriate default constructor available'
for this line: Tree() : root(0), counter(0) {}
and I don't understand why it would even use a default constructor here I'm just giving a value to a pointer of the class type.
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Node {
public:
Node(const T &value) : value(value), Left(0), Right(0) {}
~Node() {
if (Left != 0)
delete Left;
if (Right != 0)
delete Right;
}
Node& getLeft() { return *Left; }
Node& getRight() { return *Right; }
private:
Node* Left;
Node* Right;
T value;
};
template <typename T>
class Tree : public Node<T> {
public:
template<typename T>
friend ostream& operator<<(ostream& output, const Tree<T> &t);
Tree() : root(0), counter(0) {}
Tree(const T &rootValue) : root(new Node<T>(rootValue)), counter(1) {}
~Tree() { delete root; }
Tree& insert(const T &value) {
Node<T> *runner = root;
Node<T> *replacer = root;
if (runner == 0)
root = new Node<T>(value);
else
{
while (runner != 0)
{
replacer = runner;
if (value > runner->value)
runner = runner->Right;
else
runner = runner->Left;
}
if (value > replacer->value)
replacer->Right = new Node<T>(value);
else
replacer->Left = new Node<T>(value);
}
counter++;
return *this;
}
bool exists(const T &value) const {
Node<T> *runner = root;
while (runner != 0)
{
if (value == runner->value)
return true;
if (value > runner->value)
runner = runner->Right;
else
runner = runner->Left;
}
return false;
}
int size() const { return size; }
private:
Node<T> *root;
int counter;
};
template<typename T>
string preorderToString(const Node<T> &n) { //Function that receives a tree and returns a string of the preorder traversal of it
string left, middle, right;
if (n.Left != 0)
left = preorderToString((*n.Left)) + " ";
middle = to_string(n.value);
if (n.Right != 0)
right = " " + preorderToString((*n.Right));
return left + middle + right;
}
template<typename T>
ostream& operator<<(ostream& output, const Tree<T> &t) //Operator overloading that uses the function 'preorderToString' to print the tree contents
{
return output << preorderToString<T>(*(t.root));
}
int main() {
Tree<double> test;
}
c++ templates constructor initialization default
I'm trying to write a simple class for binary search tree that uses a class of nodes using templates. This is my code:
When I try to compile the code I get this error:'Node<T>': no appropriate default constructor available'
for this line: Tree() : root(0), counter(0) {}
and I don't understand why it would even use a default constructor here I'm just giving a value to a pointer of the class type.
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Node {
public:
Node(const T &value) : value(value), Left(0), Right(0) {}
~Node() {
if (Left != 0)
delete Left;
if (Right != 0)
delete Right;
}
Node& getLeft() { return *Left; }
Node& getRight() { return *Right; }
private:
Node* Left;
Node* Right;
T value;
};
template <typename T>
class Tree : public Node<T> {
public:
template<typename T>
friend ostream& operator<<(ostream& output, const Tree<T> &t);
Tree() : root(0), counter(0) {}
Tree(const T &rootValue) : root(new Node<T>(rootValue)), counter(1) {}
~Tree() { delete root; }
Tree& insert(const T &value) {
Node<T> *runner = root;
Node<T> *replacer = root;
if (runner == 0)
root = new Node<T>(value);
else
{
while (runner != 0)
{
replacer = runner;
if (value > runner->value)
runner = runner->Right;
else
runner = runner->Left;
}
if (value > replacer->value)
replacer->Right = new Node<T>(value);
else
replacer->Left = new Node<T>(value);
}
counter++;
return *this;
}
bool exists(const T &value) const {
Node<T> *runner = root;
while (runner != 0)
{
if (value == runner->value)
return true;
if (value > runner->value)
runner = runner->Right;
else
runner = runner->Left;
}
return false;
}
int size() const { return size; }
private:
Node<T> *root;
int counter;
};
template<typename T>
string preorderToString(const Node<T> &n) { //Function that receives a tree and returns a string of the preorder traversal of it
string left, middle, right;
if (n.Left != 0)
left = preorderToString((*n.Left)) + " ";
middle = to_string(n.value);
if (n.Right != 0)
right = " " + preorderToString((*n.Right));
return left + middle + right;
}
template<typename T>
ostream& operator<<(ostream& output, const Tree<T> &t) //Operator overloading that uses the function 'preorderToString' to print the tree contents
{
return output << preorderToString<T>(*(t.root));
}
int main() {
Tree<double> test;
}
c++ templates constructor initialization default
c++ templates constructor initialization default
asked Jan 3 at 17:03
Assaf LermanAssaf Lerman
6
6
Note that your don't respect rule of 5/3/0, you should probably implement your smart pointer if you cannot use std ones.
– Jarod42
Jan 3 at 17:26
You can usenullptr
to represent null pointers after c++11, and this will help others to understand your code better.
– hare1039
Jan 3 at 19:51
add a comment |
Note that your don't respect rule of 5/3/0, you should probably implement your smart pointer if you cannot use std ones.
– Jarod42
Jan 3 at 17:26
You can usenullptr
to represent null pointers after c++11, and this will help others to understand your code better.
– hare1039
Jan 3 at 19:51
Note that your don't respect rule of 5/3/0, you should probably implement your smart pointer if you cannot use std ones.
– Jarod42
Jan 3 at 17:26
Note that your don't respect rule of 5/3/0, you should probably implement your smart pointer if you cannot use std ones.
– Jarod42
Jan 3 at 17:26
You can use
nullptr
to represent null pointers after c++11, and this will help others to understand your code better.– hare1039
Jan 3 at 19:51
You can use
nullptr
to represent null pointers after c++11, and this will help others to understand your code better.– hare1039
Jan 3 at 19:51
add a comment |
1 Answer
1
active
oldest
votes
The message is a little misleading: it's not complaining about the members you've initialised, but the base that you didn't initialise. Therefore it's trying to use a default constructor of the base (Node<double>
) that doesn't exist.
Perhaps you didn't mean to make Tree<T>
derive from Node<T>
?
Fixing that (and the shadowed T
on that friend declaration), the code compiles.
add a comment |
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54026692%2fno-default-constructor-for-class-member-that-is-a-template-object-itself%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
The message is a little misleading: it's not complaining about the members you've initialised, but the base that you didn't initialise. Therefore it's trying to use a default constructor of the base (Node<double>
) that doesn't exist.
Perhaps you didn't mean to make Tree<T>
derive from Node<T>
?
Fixing that (and the shadowed T
on that friend declaration), the code compiles.
add a comment |
The message is a little misleading: it's not complaining about the members you've initialised, but the base that you didn't initialise. Therefore it's trying to use a default constructor of the base (Node<double>
) that doesn't exist.
Perhaps you didn't mean to make Tree<T>
derive from Node<T>
?
Fixing that (and the shadowed T
on that friend declaration), the code compiles.
add a comment |
The message is a little misleading: it's not complaining about the members you've initialised, but the base that you didn't initialise. Therefore it's trying to use a default constructor of the base (Node<double>
) that doesn't exist.
Perhaps you didn't mean to make Tree<T>
derive from Node<T>
?
Fixing that (and the shadowed T
on that friend declaration), the code compiles.
The message is a little misleading: it's not complaining about the members you've initialised, but the base that you didn't initialise. Therefore it's trying to use a default constructor of the base (Node<double>
) that doesn't exist.
Perhaps you didn't mean to make Tree<T>
derive from Node<T>
?
Fixing that (and the shadowed T
on that friend declaration), the code compiles.
answered Jan 3 at 17:10
Lightness Races in OrbitLightness Races in Orbit
295k54477812
295k54477812
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54026692%2fno-default-constructor-for-class-member-that-is-a-template-object-itself%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Note that your don't respect rule of 5/3/0, you should probably implement your smart pointer if you cannot use std ones.
– Jarod42
Jan 3 at 17:26
You can use
nullptr
to represent null pointers after c++11, and this will help others to understand your code better.– hare1039
Jan 3 at 19:51