Pregunta

considere el siguiente programa:

    namespace NS2 {
      class base { };

      template<typename T>
      int size(T& t) {
        std::cout << "size NS2 called!" << std::endl;
        return sizeof(t);
      } 
    };

    namespace NS1 {
      class X : NS2::base { };
    }

    namespace NS3 {
      template<typename T>
      int size(T& t) {
        std::cout << "size NS3 called!" << std::endl;
        return sizeof(t) + 1;
      }

      template<typename T>
      class tmpl 
      {
      public:
        void operator()() { size(*this); }
      };
    };

int main() +{
  NS3::tmpl<NS1::X> t;
  t();
  return 0;
}

Mi compilador (gcc 4.3.3) no compila el programa porque la llamada al tamaño es ambigua. El espacio de nombres NS2 parece haberse agregado al conjunto de espacios de nombres asociados para la llamada de tamaño en la clase tmpl. Incluso después de leer la sección sobre Búsqueda de Koenig en el Estándar ISI, no estoy seguro de si este comportamiento es conforme al estándar. ¿Lo es? ¿Alguien sabe una forma de evitar este comportamiento sin calificar la llamada de tamaño con el prefijo NS3?

Gracias de antemano!

¿Fue útil?

Solución

Los argumentos de plantilla y las clases base afectan a ADL, así que creo que GCC es correcto, aquí: NS3 proviene del alcance actual, NS1 del argumento de plantilla X y NS2 de la clase base del argumento de plantilla.

Tienes que desambiguarte de alguna manera; Sugeriría renombrar una o más de las funciones, si es factible, o tal vez usar SFINAE para desambiguar las funciones.

(Situación similar: tenga en cuenta que boost :: noncopyable es en realidad " typedef noncopyable _ :: noncopyable noncopyable; " para que el espacio de nombres de impulso no se agregue al conjunto de tipos ADL que se derivan de él.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top