템플릿 클래스에 대해 암시 적 형식 변환이 작동하지 않습니다.

st33l

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);
}

내 구조체를 템플릿으로 변환하면 암시 적 캐스팅이 작동하지 않는 이유는 무엇입니까?

자로드 42

문제는 연산자가 템플릿이므로 인수와 일치해야하므로 암시 적 변환을 공제에 적용 할 수 없습니다.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

암시 적 변환이 템플릿 인수의 컨텍스트에서 작동해야합니까?

분류에서Dev

연산자에 대한 템플릿 클래스의 암시 적 변환 == ()

분류에서Dev

decltype ()이 컴파일되는 클래스 템플릿에 대해 작동하지 않습니다.

분류에서Dev

템플릿에 대한 정규식 날짜 형식이 작동하지 않음

분류에서Dev

템플릿 클래스 메서드에 대한 암시 적 캐스팅 방지

분류에서Dev

암시 적으로 변환하는 가변 템플릿 클래스

분류에서Dev

맞춤 게시물 유형에 대해 분류 템플릿이 작동하지 않음

분류에서Dev

템플릿 인수 대체가 실패하고 암시 적 변환이 수행되지 않음

분류에서Dev

C ++의 템플릿 클래스에 대한 연산자 ostream 오버로딩이 작동하지 않습니다.

분류에서Dev

함수 템플릿 인수 추론에서 암시 적 변환을 강제하는 방법이 있습니까?

분류에서Dev

템플릿 평가 중 암시 적 형식 변환 허용

분류에서Dev

ng-class 조건식이 지시문 템플릿에서 작동하지 않습니다.

분류에서Dev

템플릿이 const 또는 참조 형식으로 암시 적으로 인스턴스화되지 않는 이유는 무엇입니까?

분류에서Dev

데이터 형식 varchar에서 varbinary (max) 로의 암시 적 변환은 허용되지 않습니다. C #

분류에서Dev

템플릿 매개 변수를 사용하지 않는 템플릿 클래스의 메서드에 대한 컴파일러 최적화가 있습니까?

분류에서Dev

템플릿 형식 정의 해결 방법이 작동하지 않는 것 같습니다.

분류에서Dev

KaTeX의 공식 스타터 템플릿이 작동하지 않습니다.

분류에서Dev

한 유형에 대해 가변 템플릿 클래스를 전문화하는 방법은 무엇입니까?

분류에서Dev

암시 적 변환이 템플릿 함수 매개 변수에 적용되지 않는 이유는 무엇입니까?

분류에서Dev

return 문에 대해 'void'형식을 'System.Collections.Generic.List'로 암시 적으로 변환 할 수 없습니다.

분류에서Dev

클래스에서 템플릿 유형이 다른 동일한 클래스로 변환

분류에서Dev

OAuth 2.0 암시 적 흐름이 localhost에 대해 작동하지만 사이트가 Azure에 배포 된 경우에는 작동하지 않습니다.

분류에서Dev

함수 포인터 참조에 대해 템플릿 추론이 작동하지 않습니다.

분류에서Dev

오래된 커널 제거 시스템 ... 내 일반적인 접근 방식이 작동하지 않습니다.

분류에서Dev

인터페이스를 사용하여 암시 적으로 형식을 변환 할 수 없습니다.

분류에서Dev

암시 적 Java에서 Scala 컬렉션으로의 변환이 작동하지 않습니다.

분류에서Dev

암시 적 Java에서 Scala 컬렉션으로의 변환이 작동하지 않습니다.

분류에서Dev

Groovy : 클로저 내부의 인스턴스 변수에 대한 암시 적 호출이 작동하지 않음

분류에서Dev

템플릿 클래스의 템플릿 유형에 대한 매개 변수를 추가 할 수 있습니까?

Related 관련 기사

  1. 1

    암시 적 변환이 템플릿 인수의 컨텍스트에서 작동해야합니까?

  2. 2

    연산자에 대한 템플릿 클래스의 암시 적 변환 == ()

  3. 3

    decltype ()이 컴파일되는 클래스 템플릿에 대해 작동하지 않습니다.

  4. 4

    템플릿에 대한 정규식 날짜 형식이 작동하지 않음

  5. 5

    템플릿 클래스 메서드에 대한 암시 적 캐스팅 방지

  6. 6

    암시 적으로 변환하는 가변 템플릿 클래스

  7. 7

    맞춤 게시물 유형에 대해 분류 템플릿이 작동하지 않음

  8. 8

    템플릿 인수 대체가 실패하고 암시 적 변환이 수행되지 않음

  9. 9

    C ++의 템플릿 클래스에 대한 연산자 ostream 오버로딩이 작동하지 않습니다.

  10. 10

    함수 템플릿 인수 추론에서 암시 적 변환을 강제하는 방법이 있습니까?

  11. 11

    템플릿 평가 중 암시 적 형식 변환 허용

  12. 12

    ng-class 조건식이 지시문 템플릿에서 작동하지 않습니다.

  13. 13

    템플릿이 const 또는 참조 형식으로 암시 적으로 인스턴스화되지 않는 이유는 무엇입니까?

  14. 14

    데이터 형식 varchar에서 varbinary (max) 로의 암시 적 변환은 허용되지 않습니다. C #

  15. 15

    템플릿 매개 변수를 사용하지 않는 템플릿 클래스의 메서드에 대한 컴파일러 최적화가 있습니까?

  16. 16

    템플릿 형식 정의 해결 방법이 작동하지 않는 것 같습니다.

  17. 17

    KaTeX의 공식 스타터 템플릿이 작동하지 않습니다.

  18. 18

    한 유형에 대해 가변 템플릿 클래스를 전문화하는 방법은 무엇입니까?

  19. 19

    암시 적 변환이 템플릿 함수 매개 변수에 적용되지 않는 이유는 무엇입니까?

  20. 20

    return 문에 대해 'void'형식을 'System.Collections.Generic.List'로 암시 적으로 변환 할 수 없습니다.

  21. 21

    클래스에서 템플릿 유형이 다른 동일한 클래스로 변환

  22. 22

    OAuth 2.0 암시 적 흐름이 localhost에 대해 작동하지만 사이트가 Azure에 배포 된 경우에는 작동하지 않습니다.

  23. 23

    함수 포인터 참조에 대해 템플릿 추론이 작동하지 않습니다.

  24. 24

    오래된 커널 제거 시스템 ... 내 일반적인 접근 방식이 작동하지 않습니다.

  25. 25

    인터페이스를 사용하여 암시 적으로 형식을 변환 할 수 없습니다.

  26. 26

    암시 적 Java에서 Scala 컬렉션으로의 변환이 작동하지 않습니다.

  27. 27

    암시 적 Java에서 Scala 컬렉션으로의 변환이 작동하지 않습니다.

  28. 28

    Groovy : 클로저 내부의 인스턴스 변수에 대한 암시 적 호출이 작동하지 않음

  29. 29

    템플릿 클래스의 템플릿 유형에 대한 매개 변수를 추가 할 수 있습니까?

뜨겁다태그

보관