Сочетание директивы 'using' с частичной перегрузкой: функция gcc или ошибка intel?

Я хочу использовать набор библиотек, написанных на C++ с компиляторами Intel. Я приложил пример кода, который демонстрирует проблему. В библиотеках есть много мест, где они используют комбинацию директивы 'using' с частичной перегрузкой (например, я хочу использовать метод foo(void) из базового класса, но перереализировать вторую версию foo в производном классе). gcc не имеет проблем, но intel имеет.

#include <iostream>
template <class F>
struct Interface
  {
     static const F f=10;
  };

template <class F>
struct Base : public Interface<F>
  {
     void foo (void) { std::cout << "void" << std::endl; }
     template <class FF>
     void foo (Interface<FF> &ii) { std::cout << "F : " << ii.f << std::endl; }
  };

template <class F,int i>
struct Derived : public Base<F>
  {
    // void foo (void) { Base<F>::foo(); }  // works fine
    using Base<F>::foo;                     // gives error
    template <class FF>
    void foo (Interface<FF> &ii) { std::cout << "Derived<" << i << "> F : " << ii.f << std::endl; }
 };

int main (void)
  {
    Derived<double,10> o;
    o.foo();                  // ok
    o.foo (o);                // problem
  }

Ошибка компилятора, которую выдает icc:

test.cc(30): error: more than one instance of overloaded function "Derived<F, i>::foo    [with F=double, i=10]" matches the argument list:
        function template "void Base<F>::foo(Interface<FF> &) [with F=double]"
        function template "void Derived<F, i>::foo(Interface<FF> &) [with F=double, i=10]"
        argument types are: (Derived<double, 10>)
        object type is: Derived<double, 10>
o.foo (o);                // problem
  ^

compilation aborted for test.cc (code 2)

Если вы удалите строку

using Base<F>::foo;

и замените ее строкой

void foo (void) { Base<F>::foo(); }

, все будет работать нормально.

Мой вопрос заключается в том, знает ли кто-нибудь, является ли это специальной функцией gcc или ошибкой icc? Или есть другой обходной только обходной только, который не будет включать в себя изменение кода?

Это с g++.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3 и icc (ICC) 12.0.2 20110112.

7
задан Tom R 4 October 2011 в 08:53
поделиться