친구를 사용하여 템플릿 구조체 내에 함수를 오버로드하려고합니다. 형식을 다른 형식으로 매핑하는 데 사용하고 싶습니다. 아래 코드에서 int
을 MyType
으로 매핑하고 싶습니다. 여기 템플릿 친구 함수 : 잘못된 함수가 호출되었습니다.
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
은 어떻게 선언을 변경할 수 있습니다
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;
}
을 그리고, 그 시도 올바른 함수가 선택 되었습니까? 아니면 토템을 사용하지 않고 유형을지도로 나타내는 방법이 있습니까? 코드 아래
참고 : 우정은 (* 11.3/10 [class.friend] *에 따라) 상속되지 않습니다. – Holt
'MakeFunction' 밖에서'map'을 정의 할 수 있습니까? – Holt
'MakeFunction' 안에 정의하는 것이 포인트입니다. 확장 될 때마다 유형을 매핑하고 싶습니다. 나의 예에서,'MyType'은 그것을 확장하기 때문에, 지정된 타입을 가진'map' 함수를 사용할 수있게해야합니다. –