我想重載模板結構中使用朋友的函數。 我想用它來將一個類型映射到另一個類型。在下面的代碼中,我想將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'。 –