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

  • Pepsi

    Pepsi

    1 Kasım 2005
  • Shylo Sharity

    Shylo Sharit

    27 EKİM 2011
  • sknbp

    sknbp

    16 Kasım 2006