Синтаксическая проблема C ++ - PullRequest
1 голос
/ 08 апреля 2010

Уже поздно, и я не могу понять, что не так с моим синтаксисом. Я спрашивал других людей, и они не могут найти синтаксическую ошибку, поэтому я пришел сюда по совету друга.

template <typename TT>
bool PuzzleSolver<TT>::solve ( const Clock &pz ) {

  possibConfigs_.push( pz.getInitial() );
  vector< Configuration<TT> > next_;

  //error is on next line
  map< Configuration<TT> ,Configuration<TT> >::iterator found;

  while ( !possibConfigs_.empty() && possibConfigs_.front() != pz.getGoal() ) {
    Configuration<TT> cfg = possibConfigs_.front();
    possibConfigs_.pop();
    next_ = pz.getNext( cfg );

    for ( int i = 0; i < next_.size(); i++ ) {
      found = seenConfigs_.find( next_[i] );
      if ( found != seenConfigs_.end() ) {
        possibConfigs_.push( next_[i] );
        seenConfigs_.insert( make_pair( next_[i], cfg ) );
      }
    }
  }
}

Что не так?

Спасибо за любую помощь.

Ответы [ 3 ]

11 голосов
/ 08 апреля 2010

Если я правильно помню, этот синтаксис неоднозначен:

map< Configuration<TT> ,Configuration<TT> >::iterator found;

Попробуйте вместо этого:

typename map< Configuration<TT> ,Configuration<TT> >::iterator found;
0 голосов
/ 08 апреля 2010

Это классический пример обязательного использования typename для идентификации именованных типов, которые зависят от параметра типа шаблона.Вы хотите использовать

typename map< Configuration<TT>, Configuration<TT> >::iterator found;

По сути, компилятор не может знать, что map< Configuration<TT>, Configuration<TT> >::iterator является типом, а не, например, переменной-членом, если вы не укажете это.Каждый раз, когда вы используете именованный тип, который зависит от параметров шаблона, вы должны использовать typename (за исключением нескольких исключительных случаев, таких как список инициализации конструктора).

0 голосов
/ 08 апреля 2010

Для зависимых имен необходимо использовать ключевое слово typename .Зависимое имя - это имя, которое зависит от параметра шаблона.

Поэтому вам необходимо:

typename map< Configuration<TT> ,Configuration<TT> >::iterator found;

Это необходимо, поскольку тип вашей карты неизвестен, пока ваш классСоздается экземпляр PuzzleSolver), поскольку он зависит от параметра шаблона TT.

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