Fienden
Hero
Så, jag sitter och bråkar med mitt binära sökträd (om ni satt i lådan igår förmiddag skrek jag en del om det då). Efter att fått pli på min borttagningsfunktion var det dags att börja leka runt lite. Så jag gjorde en testklass som jag ville plugga in i trädet.
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>class TestClass
{
private:
string str;
public:
TestClass();
TestClass(TestClass& orig);
TestClass(string str);
string toString() const;
bool operator==(const TestClass& obj);
bool operator<(const TestClass& obj);
};</pre></div></div>
Den ser ut så. I min mainfunktion kallar jag på detta like so:
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>int main()
{
BST<TestClass> bsTree;
bsTree.insert(TestClass("o"));
return 0;
}</pre></div></div>
Inte så konstigt. Men, sedan får jag en irriterande bunt fel som inte dök upp när jag testade BST med <int> och <string>:
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>1>c:\programmering\bst\bst\bst.h(86): error C2664: 'BST<T>::Node::Node(const T)' : cannot convert
parameter 1 from 'const TestClass' to 'const TestClass'
1> with
1> [
1> T=TestClass
1> ]
1> Cannot copy construct class 'TestClass' due
to ambiguous copy constructors or no available copy
constructor
1> c:\programmering\bst\bst\bst.h(83) : while
compiling class template member function 'bool
BST<T>::insert(const T &,BST<T>::Node *&)'
1> with
1> [
1> T=TestClass
1> ]
1> c:\programmering\bst\bst\bst.h(78) : see
reference to function template instantiation 'bool
BST<T>::insert(const T &,BST<T>::Node *&)' being
compiled
1> with
1> [
1> T=TestClass
1> ]
1> c:\programmering\bst\bst\bst.h(77) : while
compiling class template member function 'bool
BST<T>::insert(const T &)'
1> with
1> [
1> T=TestClass
1> ]
1> c:\programmering\bst\bst\main.cpp(11) : see
reference to function template instantiation 'bool
BST<T>::insert(const T &)' being compiled
1> with
1> [
1> T=TestClass
1> ]
1> c:\programmering\bst\bst\main.cpp(10) : see
reference to class template instantiation 'BST<T>'
being compiled
1> with
1> [
1> T=TestClass
1> ]
1>c:\programmering\bst\bst\bst.h(96): error C2678:
binary '<' : no operator found which takes a left-hand
operand of type 'const TestClass' (or there is no
acceptable conversion)
1> c:\programmering\bst\bst\testclass.h(17):
could be 'bool TestClass::operator <(const TestClass &)'
1> while trying to match the argument list
'(const TestClass, TestClass)'</pre></div></div>
Det jag som dumhuvud lyckas få ut av det här är:
error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const TestClass' (or there is no acceptable conversion)
Av någon anledning hittar den inte min operator< som finns i TestClass. Varför?
C2664: 'BST<T>::Node::Node(const T)' : cannot convert parameter 1 from 'const TestClass' to 'const TestClass'
Visual Studio är en idiot? Eller vad missar jag här?
Om någon vill ha fulla koden för BST finns den här:
http://pastebin.com/9N4m0ZWS
(och jag vet att traverse-funktionen är apig som fan, men det var så min lärare föreslog att jag skulle skriva den. Om någon vet ett mycket snyggare och mer generellt sätt att skriva den är jag VÄLDIGT intresserad).
Nåja. Uh. Jag har problem. Hjälp? (också värt att nämna: Detta är inte hemläxa eller ens en obligatorisk uppgift)
//Fienden, discuss
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>class TestClass
{
private:
string str;
public:
TestClass();
TestClass(TestClass& orig);
TestClass(string str);
string toString() const;
bool operator==(const TestClass& obj);
bool operator<(const TestClass& obj);
};</pre></div></div>
Den ser ut så. I min mainfunktion kallar jag på detta like so:
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>int main()
{
BST<TestClass> bsTree;
bsTree.insert(TestClass("o"));
return 0;
}</pre></div></div>
Inte så konstigt. Men, sedan får jag en irriterande bunt fel som inte dök upp när jag testade BST med <int> och <string>:
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>1>c:\programmering\bst\bst\bst.h(86): error C2664: 'BST<T>::Node::Node(const T)' : cannot convert
parameter 1 from 'const TestClass' to 'const TestClass'
1> with
1> [
1> T=TestClass
1> ]
1> Cannot copy construct class 'TestClass' due
to ambiguous copy constructors or no available copy
constructor
1> c:\programmering\bst\bst\bst.h(83) : while
compiling class template member function 'bool
BST<T>::insert(const T &,BST<T>::Node *&)'
1> with
1> [
1> T=TestClass
1> ]
1> c:\programmering\bst\bst\bst.h(78) : see
reference to function template instantiation 'bool
BST<T>::insert(const T &,BST<T>::Node *&)' being
compiled
1> with
1> [
1> T=TestClass
1> ]
1> c:\programmering\bst\bst\bst.h(77) : while
compiling class template member function 'bool
BST<T>::insert(const T &)'
1> with
1> [
1> T=TestClass
1> ]
1> c:\programmering\bst\bst\main.cpp(11) : see
reference to function template instantiation 'bool
BST<T>::insert(const T &)' being compiled
1> with
1> [
1> T=TestClass
1> ]
1> c:\programmering\bst\bst\main.cpp(10) : see
reference to class template instantiation 'BST<T>'
being compiled
1> with
1> [
1> T=TestClass
1> ]
1>c:\programmering\bst\bst\bst.h(96): error C2678:
binary '<' : no operator found which takes a left-hand
operand of type 'const TestClass' (or there is no
acceptable conversion)
1> c:\programmering\bst\bst\testclass.h(17):
could be 'bool TestClass::operator <(const TestClass &)'
1> while trying to match the argument list
'(const TestClass, TestClass)'</pre></div></div>
Det jag som dumhuvud lyckas få ut av det här är:
error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const TestClass' (or there is no acceptable conversion)
Av någon anledning hittar den inte min operator< som finns i TestClass. Varför?
C2664: 'BST<T>::Node::Node(const T)' : cannot convert parameter 1 from 'const TestClass' to 'const TestClass'
Visual Studio är en idiot? Eller vad missar jag här?
Om någon vill ha fulla koden för BST finns den här:
http://pastebin.com/9N4m0ZWS
(och jag vet att traverse-funktionen är apig som fan, men det var så min lärare föreslog att jag skulle skriva den. Om någon vet ett mycket snyggare och mer generellt sätt att skriva den är jag VÄLDIGT intresserad).
Nåja. Uh. Jag har problem. Hjälp? (också värt att nämna: Detta är inte hemläxa eller ens en obligatorisk uppgift)
//Fienden, discuss