在类模板中专门化一个类模板?

时间:2011-04-02 20:46:16

标签: c++ templates generics

下面的定义是失败的......我认为它与在另一个类模板(Graph)中专门化类模板(Vector)有关。谢谢!

this is the part giving me trouble (defined in Graph below) -> 
std::map<KeyType, Vertex<KeyType, ObjectType> > vertexes;

template <class KeyType, class ObjectType>
class Vertex
{
private:
    KeyType key;
    const ObjectType* object;
public:
    Vertex(const KeyType& key, const ObjectType& object);
    const KeyType getKey();
};

template <class KeyType, class ObjectType> 
class Graph
{
private:
    std::map<KeyType, Vertex<KeyType, ObjectType> > vertexes;
public:
    const Vertex<KeyType, ObjectType>& createVertex(const KeyType& key, const ObjectType& object);
};

template <class KeyType, class ObjectType>
const Vertex<KeyType, ObjectType>& Graph<KeyType, ObjectType>::createVertex(const KeyType& key, const ObjectType& object)
{
    Vertex<KeyType, ObjectType> *vertex = new Vertex<KeyType, ObjectType>(key, object);
    vertexes.insert(pair<KeyType, Vertex<KeyType, ObjectType> >(vertex.getKey(), vertex));
    return *vertex;
};

Visual Studio 10报告:

错误1错误C2228:'。getKey'的左边必须有class / struct / union c:\ documents \ visual studio 2010 \ projects \ socialnetwork \ socialnetwork \ graph.h 46 1 SocialNetwork

错误中提到的行对应于末尾附近的vertexes.insert调用。

更新:根据更改&gt;&gt;的2张海报建议进行更正。到&gt;取代。没有不同。错误仍然存​​在。

3 个答案:

答案 0 :(得分:2)

你的vertex是一个指针。要访问getKey,您需要使用->运算符,而不是.。另外,您可以使用std::make_pair来避免重复这些类型。

vertexes.insert(std::make_pair(vertex->getKey(), *vertex));

答案 1 :(得分:1)

没有错误信息本身,我不能那么有帮助。但如果我冒险猜测:

除非您使用的是C ++ 0x,否则

std::map<KeyType, Vector<KeyType, ObjectType>> vertexes;

将无法解析,因为最后的>>被解析为运算符,而不是嵌套模板参数列表的结尾。因此,您需要将其更改为

std::map<KeyType, Vector<KeyType, ObjectType> > vertexes;

但这确实在C ++ 0x中修复了。

答案 2 :(得分:0)

首先从Vector更改为Vertex(错字?)。第二个错误是“&lt;&lt;”,如果你把它们放在一起,它将是移位运算符。以下是该行应该如何:

std::map<KeyType, Vertex<KeyType, ObjectType> > vertexes;

修改:根据新信息,我可以发现另一个错误:

在createVertex方法中,您将创建一个新的Vertex,但将其用作Value。例如,在这一行:

vertexes.insert(std::pair<KeyType, Vertex<KeyType, ObjectType> >(vertex.getKey(), vertex));

电话:

vertex.getKey()

Vertex是一个指针,所以你应该改为vertex-&gt; getKey()。 有更多的错误,但都与顶点是一个被视为值的指针有关。