SORU
1 HAZİRAN 2010, Salı


Neden't ADL işlev şablonları bulmak değil mi?

Ne bölüm C belirtimi argümanını ilişkili ad kümesi işlev şablonları bulma bağımlı arama kısıtlar? Diğer bir deyişle, neden main Son çağrı altında derlemek için başarısız mı?

namespace ns {
    struct foo {};
    template<int i> void frob(foo const&) {}
    void non_template(foo const&) {}
}

int main() {
    ns::foo f;
    non_template(f); // This is fine.
    frob<0>(f); // This is not.
}

CEVAP
1 HAZİRAN 2010, Salı


Bu kısmı açıklar:

C 03 14.8.1.6 Standart:

Fonksiyon adları, değişken bağımlı arama (3.4.2) basit fonksiyon adı çağrısı kapsamında görünmez bile geçerlidir. [not: Bu arama fonksiyonu arama (3.4.1) sözdizimsel form olmasıdır. Ama açık şablon bağımsız değişken işlev şablon kullanıldığında, arama noktasında bu ismi görünür işlevi bir şablon yoksa, doğru sözdizimsel form yok. Eğer böyle bir isim görünür, çağrı sözdizimsel iyi biçimlendirilmiş ve bağımlı değişken arama geçerli değildir. Eğer bazı tür adı görünmüyorsa, bağımsız değişken bağımlı araması geçerlidir ve ek işlev şablonları başka bir ad bulunabilir.

namespace A {
  struct B { };
  template<int X> void f(B);
}
namespace C {
  template<class T> void f(T t);
}
void g(A::B b) {
  f<3>(b);    //ill-formed: not a function call
  A::f<3>(b); //well-formed
  C::f<3>(b); //ill-formed; argument dependent lookup
              // applies only to unqualified names
  using C::f;
  f<3>(b);    //well-formed because C::f is visible; then
              // A::f is found by argument dependent lookup
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • Erica Griffin

    Erica Griffi

    8 HAZİRAN 2009
  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006