を禁止する私は、次のしているデモコード:自動型推論
In function ‘int main()’:
11:23: error: call of overloaded ‘func(int)’ is ambiguous
11:23: note: candidates are:
2:3: note: T func(const U&) [with int i = 1, T = int, U = int]
5:3: note: T func(const T&) [with int i = 1, T = int]
:それは役に立たないようだが、問題を表示するには十分ですので、私の実際のコードの煮詰めたバージョンである
template <int i, typename T, typename U>
T func(const U &t){return i * t;}
template <int i, typename T>
T func(const T &t){return 2 * i * t;}
int main()
{
return func<1, int>(1);
}
したがって、(テンプレートパラメータUの)自動型推論は、テンプレート関数の適切なバージョン(それは2パラメタのみを持つもの)を選択することに干渉することは明らかです。
私は両方のバージョンが基本的で特殊なテンプレートを持っている必要があります。
質問:この時点でタイプを自動的に推論しないようにコンパイラに指示する可能性はありますか(何らかの理由で:2つのパラメータしかないテンプレートを取るなど)。
明白な他にも意味がありますか? (これは関数テンプレートに異なる名前を与えることです - あなたが何を使うべきかをコンパイラに指示するためにあなた自身で何かをする必要があるなら、同じ名前を持つのは何ですか?) – Mat
これは最後の選択ですが、機能は同じ名前を共有する。 – Nobody
名前を変更して再設計を提案します。私にとってこれは非常に悪いコードのような感じです。過負荷のセットのどの機能が使用されているのかという疑問で、人々はすでに簡単に混乱します。このようなものが存在すると、それはさらに困難になり、後で維持不能なコードにつながる可能性があります。 – LiKao