オーバーロードテンプレートのインスタンス化順序を変更したいと思います。私のコードは次のとおりである:コンパイラはデフォルトとしてテンプレート2を選んだのだろうテンプレートインスタンス化の順序を変更するにはどうすればよいですか?
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
struct Base
{
};
template<typename T>
struct Derived:Base<T>
{
};
//template 1
template<typename T1>
void f(Base<T1>& a){
cout<<"in 1\n";
}
//template 2
template<typename T2>
void f(T2 b){
cout<<"in 2\n";
}
int main(){
Derived<int> v1;
f(v1);
}
、私はそれがテンプレート1
'F(V1)'のまま、あなたが許可すれば、テンプレートのインスタンス化のルールは、時には驚くべきことである...それはあなたのためのテンプレートを見つけることはできません。コンパイラは型を推論します。 –
SFINAEまたはタグディスパッチを使用するか、コールサイトで呼び出す関数を指定する必要があります。 – Jarod42
あなたはテンプレート2の 'b'で何をしたいのか、あなたが*望む*の引数について詳しく述べるべきです。あなたがしたいことが2 "で印刷するだけであれば、タグディスパッチ、SFINAE、または特性を含まない簡単なソリューションがあります。 –