B가 A로 캐스팅 될 수 있도록 A와 B라는 두 개의 구조체가 있으며 A에 대해 정의 operator+
했습니다.
struct A
{
float x;
A(float _x) : x(_x) {}
};
struct B
{
float x;
operator A()
{
return A{x};
}
};
A operator+ (A left, A right)
{
return A(left.x+right.x);
}
operator+
for B를 정의하지 않으면 컴파일러는 B 개체를 A에 암시 적으로 캐스팅 한 다음 추가하는 것을 알고 있습니다. 이는 다음과 같은 작동을 의미합니다.B b1 = {1.0f}; B b2 = {2.0f}; A a = b1 + b2
그러나 구조체를 템플릿 클래스로 변환하고 B 대신 D에서 동일한 작업을 수행하려고하면 오류가 발생합니다.
오류 : '연산자 +'와 일치하지 않음 (연산자 유형은 'D'및 'D'임)
template<typename T>
struct C
{
T x;
C<T>(T _x) : x(_x) {}
};
template<typename T>
struct D
{
T x;
operator C<T>()
{
return C<T>(x);
}
};
template<typename T>
C<T> operator+ (C<T> left, C<T> right)
{
return C<T>(left.x+right.x);
}
내 구조체를 템플릿으로 변환하면 암시 적 캐스팅이 작동하지 않는 이유는 무엇입니까?
문제는 연산자가 템플릿이므로 인수와 일치해야하므로 암시 적 변환을 공제에 적용 할 수 없습니다.
friend
당신의 친구입니다 :)
template<typename T>
struct C
{
T x;
C(T _x) : x(_x) {}
friend C operator+ (C left, C right) // Function is no longer template
{
return C(left.x + right.x);
}
};
이제, 당신이 할 수있는 c + c
, c + d
, d + c
.
friend 함수에는 ADL과 관련된 특별한 규칙이 있으므로 d + d
에서는 friend operator+(C,C)
.
그래서 우리는 다른 friend
함수 가 필요합니다 D
:
template <typename T>
struct D
{
T x;
operator C<T>() { return C<T>(x); }
friend C<T> operator+ (D left, D right)
{
return C<T>(left) + C<T>(right);
}
};
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다