5

次のコードが正常にコンパイルされる理由がわかりません。

#include <iostream>                                                                 

void bar(int x) {                                                                   
  std::cout << "int " << x << std::endl;                                            
}                                                                                   

void bar(double x) {                                                                
  std::cout << "double " << x << std::endl;                                         
}                                                                                   

template <typename A, typename B>    // Note the order of A and B.                                               
void foo(B x) {                                                                     
  bar((A)x);                                                                        
}                                                                                   

int main() {                                                                        
  int x = 1;                                                                        
  double y = 2;                                                                     

  foo<int>(x);        // Compiles OK.                                                              
  foo<double>(y);     // Compiles OK.                                               

  return 0;                                                                         
}

しかし、以下のように順序を切り替えるAB、コンパイルされません。

#include <iostream>                                                                 

void bar(int x) {                                                                   
  std::cout << "int " << x << std::endl;                                            
}                                                                                   

void bar(double x) {                                                                
  std::cout << "double " << x << std::endl;                                         
}                                                                                   

template <typename B, typename A>    // Order of A and B are switched.
void foo(B x) {                                                                     
  bar((A)x);                                                                        
}                                                                                   

int main() {                                                                        
  int x = 1;                                                                        
  double y = 2;                                                                     

  foo<int>(x);        // error: no matching function for call to ‘foo(int&)’
  foo<double>(y);     // error: no matching function for call to ‘foo(double&)’                                                              

  return 0;                                                                         
}      

編集:アドホックな説明は大歓迎ですが、誰かが仕様を正確に指摘できればもっと良いでしょう。言う。ありがとう!

4

1 に答える 1

7

最初のものでは、コンパイラーAint、それを具体的に.で指定したためであり、それは、渡したパラメーターのせいでもあるfoo<int>ことを認識しています。したがって、とは両方とも既知であるか、推測することができます(次のように言うことができます:供給されている、暗示されている)。BintABAB

ただし、2番目の例では、B最初に来Aてパラメーターリストに表示されないため、コンパイラーは何Aであるかを認識できず、エラーが発生します。Bとは何であるかを明示的に伝えているのでfoo<int>、渡すパラメーターもaBであり、呼び出し時に、int以前の明示的な定義と一致しますBが、暗黙的または明示的には言及されていないAため、コンパイラーは停止してエラーが発生する必要があります。

あなたは本当にこれのための標準を必要としません、それはただ常識です。いったい何がA2番目のものになりますか?

ただし、この質問をしていただきありがとうございます。この前に、パラメータリストで一部のパラメータを明示的に指定し、他のパラメータを暗黙的に指定できることに気づかなかったためです。

于 2012-04-25T20:53:02.933 に答える