Специализировать шаблон класса в шаблоне класса? - PullRequest
1 голос
/ 03 апреля 2011

Определение ниже не соответствует ... Я думаю, что это как-то связано со специализацией шаблона класса (Vector) в другом шаблоне класса (Graph).Спасибо!

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' должен быть класс / struct / union c: \ Documents \ visual studio 2010 \ projects\ socialnetwork \ socialnetwork \ graph.h 46 1 SocialNetwork

Строка, упомянутая в ошибке, соответствует вызову vertexes.insert в конце.

ОБНОВЛЕНИЕ: внесено исправление, предложенное двумя авторамиизменить >> на>>.Нет разницы.Ошибка сохраняется.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2011

Ваш vertex является указателем. Для доступа к getKey необходимо использовать оператор ->, а не .. Кроме того, вы можете использовать std::make_pair, чтобы избежать повторения типов.

vertexes.insert(std::make_pair(vertex->getKey(), *vertex));
1 голос
/ 03 апреля 2011

Не имея самого сообщения об ошибке, я не могу быть таким полезным.Но если я рискну предположить:

Если вы не используете C ++ 0x,

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

не сможет выполнить синтаксический анализ, поскольку >> в конце анализируется как оператор, так какнапротив конца списка параметров вложенного шаблона.Итак, вам нужно изменить это значение на

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

Это исправлено в C ++ 0x, однако.

0 голосов
/ 03 апреля 2011

Первое изменение с Vector на Vertex (опечатка?). Вторая ошибка - «<<», если вы сложите их вместе, это будет оператор сдвига. Вот как должна выглядеть эта строка: </p>

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

Редактировать: С новой информацией я могу обнаружить еще одну ошибку:

В методе createVertex вы создаете новую вершину, но используете ее в качестве значения. Например, в этой строке:

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

Звонок:

vertex.getKey()

Vertex - это указатель, поэтому вы должны перейти к vertex-> getKey (). Есть и другие ошибки, но все они связаны с тем, что вершина является указателем и рассматривается как значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...