C ++ наследование класса шаблона - PullRequest
0 голосов
/ 19 января 2011

Я портировал некоторый код C ++, который был написан давно, и обычно компилируется с Visual C ++ (версия Visual Studio 7.1) и Intel C ++ Compiler 11.0, целевой платформой является Linux (Suse x86-64), сGCC 4.3.2 и Intel C ++ Compiler 11.1

Проблема заключается в том, что такой код

FileA.h

template<typename T, int dim>
class A
{
 public:
  A(){};
  ~A(){};
 protected:
  void foo1(){};
}

FileB.h

#include "FileA.h"
template<typename T>
class B : public A<T, 2>
{
 public:
  B(){};
  ~B(){};
  void foo(){ foo1(); }
}

main.cpp

#include "FileB.h"
int main()
{
 B<float> b = B<float>();
}

не компилируется в Linux (Intel C ++ 11.1, GCC 4.3.2), но прекрасно компилируется в Windows (Visual C ++ 7.1, Intel C ++ 11.0), но, безусловно, не должензависит от платформы.GCC сообщает, что если я изменю foo1 () на foo1 (T a), он будет работать (и он работает), но я не могу изменить код и должен использовать Intel C ++ для окончательного выпуска.

Я быБуду рад, если кто-нибудь сможет помочь с любым советом.

Ответы [ 3 ]

2 голосов
/ 19 января 2011

foo1 не является зависимым выражением, поэтому базовый класс, который является зависимым типом, не используется для разрешения вызова foo1.

Поскольку вы не можете изменить код, вычучела.Если бы вы могли изменить код, вам нужно было бы изменить выражение, чтобы оно было зависимым.Обычно это делается путем изменения его на this->foo1().

1 голос
/ 19 января 2011

Это известная проблема с шаблонами. Это объясняется в C ++ FAQ

0 голосов
/ 19 января 2011

В версии gcc 4.4.1 (os is Ubuntu) я мог бы превратить ошибку компиляции в предупреждение компиляции, используя опцию -fpermissive для компилятора.

Редактировать: тот факт, что некоторые компиляторы принимают его, не означает, что он будет продолжать принимать его в будущих версиях.

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