私はテンプレート構造内の関数をfriendを使ってオーバーロードしようとしています。 タイプを別のタイプにマップするために、それを使用したいと思います。以下のコードでは、タイプint
をMyType
にマップしたいと考えています。テンプレートフレンド関数:間違った関数が呼び出されました
は、ここで私はこれまでやったことだ:
void map(...){} // Worst case
// Here's the class that will overload our function
template<typename Type, typename T>
struct MakeFunction {
friend Type map(T) { return {}; }
};
// Make the function with int?
struct MyType : MakeFunction<MyType, int> {};
int main() {
// The type obtained is void, worst case choosed. The expected result is `MyType` as return type.
std::cout << typeid(decltype(map(int{}))).name() << std::endl;
return 0;
}
その後、私がすることを試みた:
template<typename T>
void map(){} // Worst case
// Here's the class that will overload our function
template<typename Type, typename T>
struct MakeFunction {
// Compilation error.
friend Type map<T>() { return {}; }
};
struct MyType : MakeFunction<MyType, int> {};
int main() {
std::cout << typeid(decltype(map<int>())).name() << std::endl;
return 0;
}
しかし、コンパイルが失敗しました:
error: defining explicit specialization ’map<T>’ in friend delcaration
どのように宣言を変更することができます正しい関数が選択されていますか?または、ボイラープレートなしで型をマップする方法はありますか?コードの下
注:友情は継承されません(* 11.3/10 [class.friend] *に従って)。 – Holt
'MakeFunction'の外で' map'を定義できますか? – Holt
'MakeFunction'の中でそれを定義することは、一種のポイントです。私はそれが拡張されるたびに型をマップしたい。私の例では、 'MyType'はそれを拡張するので、指定された型の関数' map'を利用可能にする必要があります。 –