1

私の前の質問に続いて、 保護されたメンバーは派生クラスでは不明です

その行のどの部分が間違っているのか理解できません。

ここにコンパイルエラーがあります:

template <typename K, typename T>
bool graph<K, T>::is_edge(const K& k1, const K& k2)
{
  if (this->nod.find(k1) == this->nod.end() || this->nod.find(k2) == this->nod.end())
    throw std::string("is_edge: Node does not exist");

  if (k1 < k2) // Below line makes error: expected primary-expression!!!!
    return std::find(this->edg.begin(), this->edg.end(), edge(k1, k2)) != this->edg.end();
  return std::find(this->edg.begin(), this->edg.end(), edge(k2, k1)) != this->edg.end();
}

または、このステートメントの何が問題なのですか:

std::find(this->edg.begin(), this->edg.end(), edge(k1, k2)) != this->edg.end();

完全なコードはここにあり、ここでテストおよびコンパイルできます。

4

2 に答える 2

5

完全なコードを見るedgeと、基本クラスでも定義されていることがわかります。また、次のように、依存する名前であることをコンパイラーに通知する必要があります。

if (k1 < k2) // Below line makes error: expected primary-expression!!!!
  return std::find(this->edg.begin(), this->edg.end(), typename _base_graph<K, void*, T>::edge(k1, k2)) != this->edg.end();
return std::find(this->edg.begin(), this->edg.end(), typename _base_graph<K, void*, T>::edge(k2, k1)) != this->edg.end();
于 2012-11-16T10:10:05.270 に答える
1

次のように、派生クラスを介して基本クラスに解決できます (少なくとも LLVM は =):

template <typename K, typename T>
bool graph<K, T>::is_edge(const K& k1, const K& k2)
{
    typedef typename graph::edge edge;

    if (this->nod.find(k1) == this->nod.end() || this->nod.find(k2) == this->nod.end())
        throw std::string("is_edge: Node does not exist");

    if (k1 < k2)
        return std::find(this->edg.begin(), this->edg.end(), edge(k1, k2)) != this->edg.end();
    return std::find(this->edg.begin(), this->edg.end(), edge(k2, k1)) != this->edg.end();
}
于 2012-11-16T10:17:25.550 に答える