Ошибки, связанные с шаблонными функциями в GCC 3.4.6 - PullRequest
2 голосов
/ 06 января 2010

Сегодня я столкнулся со странной ошибкой компиляции в офисе и подозреваю, что это ошибка в нашей версии GCC (3.4.6).Я был в состоянии свести это к нескольким строкам кода (ниже).Я получаю ошибку компиляции:

test.cpp:26: error: expected primary-expression before '>' token
test.cpp:26: error: expected primary-expression before ')' token

Эту ошибку можно избежать, введя временную переменную для хранения результата первого оператора (bar.value("yoyo")).Может кто-нибудь сказать мне, что вызывает это?Это ошибка в GCC 3.4.6 (кажется, что она работает в GCC 4.xx) и есть ли другие подобные ошибки, связанные с шаблонами, в этой версии?

class Foo
{
public:
  template<typename T> bool doIt() const { return true; }
};

class Bar
{
public:
  Foo value(const char * key)
  {
    return Foo();
  }
};

template<typename T>
void
mytestfunc()
{
   Bar bar;
   // Works fine:
   Foo foo = bar.value("yoyo");
   foo.doIt<T>();

   // Does not work on gcc 3.4.6:
   bar.value("yoyo").doIt<T>();
}

int main(int argc, char * args[])
{
  return 0;
}

Ответы [ 2 ]

4 голосов
/ 06 января 2010

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

 bar.value("yoyo").template doIt<T>();

Насколько я понимаю, проблема связана с зависимыми именами, подобно тому, как иногда вам нужно префиксировать типы с typename.

Вышеприведенное указывает компилятору, что doIt - это метод элемента шаблона, а не переменная-член doIt, которая сравнивается с помощью оператора "меньше чем".

1 голос
/ 06 января 2010

Компилятор должен создавать временную переменную в последнем утверждении, которая работает точно так же, как «foo» в предыдущих двух утверждениях. Так что да, я думаю, что это ошибка, тем более что она работает в GCC 4. С другой стороны, это довольно необычный код, поэтому на практике он может не появляться слишком часто. В общем, я обнаружил, что 3.4 является довольно солидной по шаблонам, особенно по сравнению с некоторыми проприетарными компиляторами.

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