Nekromanti [C++] Operatorer för T i en template-klass

Fienden

Hero
Joined
11 Oct 2008
Messages
1,655
Location
Någonstans i ödemarken
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
 

Björn den gode

Swashbuckler
Joined
5 Jun 2001
Messages
3,314
Location
Göteborg
1> Cannot copy construct class 'TestClass' due
to ambiguous copy constructors or no available copy
constructor

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?
Jag vet inte vad som är felet, det är lite svårt att säga så här från sidan, men tipset är att alltid bara kolla på första felet. Här säger den att den inte kan copy-konstruera en TestClass, så då hade jag kommenterat ut det och bara försökt köra

TestClass a("0");
TestClass b(a);

och se om det fungerar. Om det inte gör det så är det där du får leta, det enda jag kan se direkt som känns lite konstigt är att du inte har deklarerat copykonstruktorn att ta ett const-argument, alltså
TestClass(const TestClass& orig); det är standard, men borde inte spela någon roll.

Ligger test class och main i samma fil, och annars har du inkluderat test class i mainfilen?
 
Top