メソッドをオーバーロードすると、複数のマッチが利用可能な場合にコンパイラがより単純なマッチングを選択すると考えられます。ポインタ型のメソッドよりもサイズテンプレートのメソッドを優先させる
#include <iostream>
#include <string>
struct A {
static void foo(const char *str) {
std::cout << "1: " << str << std::endl;
}
template<int N> static void foo(const char (&str)[N]) {
std::cout << "2: " << str << std::endl;
}
};
int main()
{
A::foo("hello");
}
出力は1: hello
次のとおりです。
static void foo(const char *str)
メソッドをコメントアウトすると、それは正常にコンパイルされ、
2: hello
を出力します。
既知のサイズの配列でテンプレートメソッドが呼び出され、ポインタタイプで非テンプレートメソッドが呼び出されるようなクラスに両方のメソッドを持たせるにはどうすればよいですか?
私は次のことを試してみました:TCによって示唆されるように、
In function 'int main()':
17:17: error: call of overloaded 'foo(const char [6])' is ambiguous
17:17: note: candidates are:
6:15: note: static void A::foo(const _Ty*) [with _Ty = char]
10:32: note: static void A::foo(const char (&)[N]) [with int N = 6]
まず、 '_Ty'を使用しないでください。これは実装に予約されています。次に、 'const T * const&str'です。 –
ありがとうございました! T対_Tyに関しては、私は尊重して反対するでしょう。 'T'は、テキストエディタで検索する必要があるときに、ひどい名前を付ける選択肢です。 – GaspardP
"正当に反対している"というのは問題ではありません。 "明らかな理由がなければ壊れる可能性があります"という問題です。実装の予約された型名を使用しています。 http://stackoverflow.com/questions/12924243/are-identifiers-starting-with-an-underscore-reserved-according-to-thelatest-c – druckermanly