【问题标题】:Specialize a class template within a class template?在类模板中专门化一个类模板?
【发布时间】:2011-04-02 20:46:16
【问题描述】:

下面的定义失败了......我认为它与在另一个类模板(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' 左侧必须有类/结构/联合 c:\documents\visual studio 2010\projects\socialnetwork\socialnetwork\graph.h 46 1 SocialNetwork

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

更新:按照 2 个将 >> 更改为 >> 的海报的建议进行了更正。没有不同。错误仍然存​​在。

【问题讨论】:

  • 您将不得不分享错误消息。
  • 失败是怎么回事?您使用哪种编译器?

标签: c++ templates generics


【解决方案1】:

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

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

【讨论】:

  • 宾果游戏!非常感谢你。我认为问题出在顶点上,因为 Visual Studio 的 Intellisense 无法在该变量上正常工作。 :\
【解决方案2】:

本身没有错误消息,我帮不上忙。但如果我可以大胆猜测:

除非你使用的是 C++0x,

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

解析将失败,因为末尾的&gt;&gt; 被解析为运算符,而不是嵌套模板参数列表的末尾。因此,您需要将其更改为

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

不过,这确实在 C++0x 中得到了修复。

【讨论】:

  • 嗨乔纳森!谢谢回复。所述修复不起作用。我刚刚在原始问题中发布了错误消息。
  • 即使其他答案解决了这个问题,我认为这个观察在未来对其他人有用。投票赞成!
【解决方案3】:

首先从 Vector 更改为 Vertex(错字?)。第二个错误是“

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

编辑:有了新信息,我可以发现另一个错误:

在 createVertex 方法中,您正在创建一个新顶点,但将其用作值。例如,在这一行:

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

电话:

vertex.getKey()

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

【讨论】:

  • 嗨菲利普!事实上,Vector 是一个错字。在尝试修复此问题所涉及的错误时成功。更正了它。向问题添加了错误消息。更换班次操作员的上述修复不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多