mboost-dp1

C++ Class Templates


Gå til bund
Gravatar #1 - Windcape
19. aug. 2009 00:20
Jeg satte mig for at kigge på C++ "Generics", men er løbet ind i et underligt problem.

'DataStructures::Graph::Node' : use of class template requires template argument list

Er der nogen som kan forklare meningen med det?

Node.cpp

#include "stdafx.h"
#include "Node.h"

namespace DataStructures
{
namespace Graph
{
template <typename TValue> Node::Node(TValue value)
{
_value = value;
}

template <typename TValue> TValue getValue()
{
return _value;
}
}
}


Node.h

#include "stdafx.h"

namespace DataStructures
{
namespace Graph
{
// Generic Graph Node class.
template <typename TValue>
class Node
{
private:
TValue _value;

public:
// Constructs a new Graph Node with the given value.
Node(TValue value);

// Return the Node Value
TValue getValue();
};
}
}
Gravatar #2 - Windcape
19. aug. 2009 00:50
Ok, har fået løst problemet. Det lader til at C++ kræver at man definere alt funktionalitet i header filen, medmindre man eksplicit vil definere alle typer ens template kan benytte manuelt!

Jeg har lidt lyst til at bonke den person som sagde at det var ligeså simpelt som C# og Java, lidt i hovedet :p


#include "stdafx.h"

namespace DataStructures
{
namespace Graph
{
// Generic Graph Node class.
template <typename TValue>
class Node
{
private:
TValue _value;

public:
// Constructs a new Graph Node with the given value.
Node(TValue value);

// Return the Node Value
TValue getValue();
};

template <typename TValue> Node<TValue>::Node(TValue value)
{
_value = value;
}

template <typename TValue> TValue Node<TValue>::getValue()
{
return _value;
}
}
}

Gravatar #3 - arne_v
19. aug. 2009 01:27
#1-2

C++ templates er beregnet til at blive defineret i header filer og bliver så compilet ind når du oversætter din .cpp fil.

Det gør det jo ikke svært bare anderledes end Java/C#.

Og på nogle områder er det faktisk nemmere. Det er f.eks. lige ud af landevejen at lave en template som bruger operatorer .

Der er selvfølgelig også ting som er vanskelige. C++ er ikke et nemt sprog.

Gravatar #4 - Windcape
19. aug. 2009 01:39
Det jeg synes var besværligt var alt den redundans der er, som gav en masse linker errors indtil jeg fik lært hvordan det skal gøres.

F.eks. synes jeg at dette her er helt overdrevent

template <typename TValue> Node<TValue>::Node(TValue value)


Jeg er så glad for at man kan sætte det op inline istedet, dvs.


#include "stdafx.h"

namespace DataStructures
{
namespace Graph
{
// Generic Graph Node class.
template <typename TValue>
class Node
{
private:
TValue _value;

public:
// Constructs a new Graph Node with the given value.
Node(TValue value)
{
_value = value;
}

// Return the Node Value
TValue getValue()
{
return _value;
}
};
}
}
Gravatar #5 - arne_v
19. aug. 2009 01:57
#4

Link errors i forbindelse med templates optræder når man glemmer den måde templates bliver behandlet på af compileren.

Inline er hyppigt brugt med templates.

Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login