C belirtilen şablon parametreleri'değil 11 make_pair derleme | Netgez.com
SORU
9 Mart 2012, Cuma


C belirtilen ÅŸablon parametreleri'deÄŸil 11 make_pair derleme

-Std=c 11 etkin g 4.7 (daha sonra anlık bir) ile oynuyordum. Varolan kod tabanı ve biraz kafamı karıştırdı başarısız bir durumda derlemeye çalıştım.

Biri neler olduğunu açıklayabilir sevinirim.

Ä°ÅŸte kod

#include <utility>
#include <iostream>
#include <vector>
#include <string>

int main ( )
{
    std::string s = "abc";

    // 1 ok
    std::pair < std::string, int > a = std::make_pair ( s, 7 );

    // 2 error on the next line
    std::pair < std::string, int > b = std::make_pair < std::string, int > ( s, 7 );

    // 3 ok
    std::pair < std::string, int > d = std::pair < std::string, int > ( s, 7 );

    return 0;
}

Make_pair olduğunu anlıyorumdemek(1) dava olarak kullanılır. (ben bu tür belirtirseniz, o zaman kullanın (3) olabilirim), Ama bu durumda başarısız olduğunu anlamıyorum.

Kesin hata:

test.cpp: In function ‘int main()’:
test.cpp:11:83: error: no matching function for call to ‘make_pair(std::string&, int)’
test.cpp:11:83: note: candidate is:
In file included from /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c  /4.7.0/utility:72:0,
             from test.cpp:1:
/gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c  /4.7.0/bits/stl_pair.h:274:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_T1>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
/gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c  /4.7.0/bits/stl_pair.h:274:5: note:   template argument deduction/substitution failed:
test.cpp:11:83: note:   cannot convert ‘s’ (type ‘std::string {aka std::basic_string<char>}’) to type ‘std::basic_string<char>&&’

Yine, burada sözkonusu olan sadece "neler oluyor?" Şablon şartname kaldırarak sorunu çözebilirsiniz biliyorum, ama ben yorganın altında burada başarısız olan şeyin ne olduğunu bilmek istiyorum. Şimdiden teşekkürler.

DÃœZENLEME:

  • g 4.4 herhangi bir sorun ile bu kodu derler.
  • Kaldırma -std=c 11 ayrıca herhangi bir sorun ile kodu derler.

CEVAP
9 Mart 2012, Cuma


Bu std::make_pair kullanılmak üzere tasarlanmıştır nasıl değil, açıkça şablon değişkenleri belirtmek lazım.

C *8 11* iki bağımsız değişken, T&& T U şablon parametreleri yazın nerede U&&, türü alır. Etkili bir şekilde, bu gibi görünüyor (dönüş tipi yok sayarak):

template <typename T, typename U>
[return type] make_pair(T&& argT, U&& argU);

std::make_pair ve açıkça Şablon Türü bağımsız değişkenleri belirtin aradığınızda, tartışma yok kesinti gerçekleşir. Bunun yerine, tür bağımsız değişkenleri doğrudan şablon bildirgesine göre, verimli değiştirilmiştir:

[return type] make_pair(std::string&& argT, int&& argU);

Bu parametre türleri de rvalue başvurular olduğunu unutmayın. Böylece, rvalues bağlamak sadece. Bu rvalue bir ifade olduğu için geçmesi ikinci bağımsız değişken için bir sorun, 7 değil. s ancak, lvalue expression (taşınan değil geçici değil). Bu işlev şablon hatayı alıyorum bu yüzden bağımsız bir eşleşme anlamına gelir.

Neden T U şablon bağımsız değişken listesinde ne olduğunu açıkça belirtin yok ne işe yarıyor ki? Kısacası, rvalue başvuru parametreleri şablonları özel. Nedeniyle dil denilen bir özelliğe kısmenbaşvuru çöküyor, rvalue başvurusu A tipi A, her türlü bağlayabilirsiniz şablon parametre türü olduğu A&&, parametre.

Hiç fark etmez ister A bir lvalue, bir rvalue, sabit nitelikli, uçucu-vasıflı veya vasıfsız, A&& bağlayabilirsiniz bu nesne (yine, Eğer ve sadece eğer A kendisi bir şablon parametresi).

Sizin örnekte, çağrı yapalım

make_pair(s, 7)

Burada, s std::string 7 30 ** türünde bir rvalue tip bir lvalue. İşlev şablonu argümanları belirtin olmadığınız için, şablon değişkeni kesintisi argümanlar ne olduğunu anlamak için yapılır.

Bağlamak T&& derleyici s, bir lvalue, T 34**, 35* *türünde bir değişken getirili olmak şüpheleri. Başvurular olsa da, bu "referans" std::string& olmak daraltır. çift yok s bir maç.

Bu basit bağlama 7 U&&: derleyici olabilir anlamak U int, verimli bir parametre türü int&&, bağlar başarıyla 7 çünkü bir rvalue.

Bu yeni dil özellikleri ile inceliklerini bir sürü vardır, ama eğer basit bir kural takip ederseniz, çok kolay:

Eğer şablon bağımsız değişken işlev bağımsız çıkarılabilir, çıkarılabilir olsun. Açıkça kesinlikle gerekir sürece bağımsız vermeyin.

Derleyici zor iÅŸi yapalım, ve ™.9 zaman zaten senin istediÄŸin de olacak. Ä°stediÄŸin bu olmadığı zaman, genellikle tanımlamak ve düzeltmek için kolay bir derleme hatası alırsınız.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Chanre Joubert

    Chanre Joube

    27 Temmuz 2012
  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • TotalxLuna

    TotalxLuna

    27 Kasım 2011