2013-07-26 5 views
0

이 질문은 어제받은 answer에서 비롯됩니다. 다음 함수의 경우 및 U이 모두 std::complex<double> 인 경우 오류 couldn't deduce template parameter ‘V’이 표시됩니다. TU이 다른 경우 함수는 컴파일되고 의도 한대로 작동합니다. 다음과 같이T 및 U 유형이 동일하면 함수 템플릿에서 유형을 추론 할 수 없습니다.

template<class T, class U, class V> 
auto operator*(const T a, const matrix<U> A) -> decltype(std::declval<T>()*std::declval<U>()) 
{ 
    matrix<V> B(A.size(1),A.size(2)); 
    for(int ii = 0; ii < B.size(1); ii++) 
    { 
     for(int jj = 0; jj < B.size(2); jj++) 
     { 
      B(ii,jj) = a*A(ii,jj); 
     } 
    } 
    return B; 
} 

사용법은 다음과 같습니다

std::complex<double> a1; 
matrix<std::complex<double> > A1; 
double a2; 
matrix<std::complex<double> > A2; 

/* ... */ 

matrix<std::complex<double> > B1 = a1*A1; // Compiler error 
matrix<std::complex<double> > B2 = a2*A2; // Compiles and runs fine. 

나는 또한 내가 4.7.3 및 활성화 C++ 11 ++ g로 컴파일하고 언급해야한다.

편집 :

나는 또한이 기능 템플릿을 제공하는 것입니다 발견 주위에 작업이 추가로

template<class T> 
matrix<T> operator*(const T a, const matrix<T> A) 
{ 
    matrix<T> B(A.size(1),A.size(2)); 
    for(int ii = 0; ii < B.size(1); ii++) 
    { 
     for(int jj = 0; jj < B.size(2); jj++) 
     { 
      B(ii,jj) = a*A(ii,jj); 
     } 
    } 
    return B; 
} 

, 컴파일 위의 두 가지 경우 모두를 제대로 실행합니다. 이 선언 주어진 추론 할 수 V 때문에 내가 관여 operator*의 또 다른 과부하가 있어야합니다 생각

답변

3

:

template<class T, class U, class V> 
auto operator*(const T a, const matrix<U> A) 
    -> decltype(std::declval<T>()*std::declval<U>()); 

이 함수를 호출 할 수있는 유일한 방법은, 예를 들어, 명시 적으로 V을 지정 operator*<int, long, long>(...)입니다 . 편집


: 두 번째 코드 예제에서 operator*(T, matrix<T>)에 대한 서명을 보면, 당신의 첫 번째 코드 샘플을 읽어야 나타납니다 :

template<class T, class U> 
auto operator*(const T a, const matrix<U>& A) -> matrix<decltype(a*A(0,0))> 
{ 
    matrix<decltype(a*A(0,0))> B(A.size(1),A.size(2)); 
    for(int ii = 0; ii < B.size(1); ii++) 
    { 
     for(int jj = 0; jj < B.size(2); jj++) 
     { 
      B(ii,jj) = a*A(ii,jj); 
     } 
    } 
    return B; 
} 

operator*(T,matrix<T>)

는 특별한 경우로서 필요는 없습니다.

+0

B 및 반환 형식이 더 V와 함께, matrix<decltype(declval<T>()*declval<U>())> 될 것으로 기대한다. 세 가지 답변 모두 도움이되었으며 유사한 정보를 제공했습니다. 감사합니다. – OSE

+0

'matrix ' –

+0

@MooingDuck으로 간단해질 수 있습니다. 'decltype (std :: declval () * std :: decl ())'나는 생각없이 선언 앞에 반사적으로 이동했습니다. 후행 반환 형식으로 단순화하면 가독성이 크게 향상됩니다. 나는 그 대답에 통합 할 것이다. – Casey

2

T와 U가 다른 함수가 호출되면 컴파일러가 올바르므로 V를 추론 할 수 없다고 생각합니다. 심지어 나는 당신이 그 매개 변수가 있어야한다고 생각하는 것을 추론 할 수 없다. Here's proof that the second doesn't compile and run either,이 경우 다른 함수가 호출되고 있음을 의미합니다. 확실한 해결 방법은 class V 템플릿 매개 변수 유형을 제거하고 단순히 연역 형을 사용하는 것입니다. 어쩌면 당신이 원했던 것 more like this?

코드를 다시 보면, 실패한 코드는 complex * matrix이고 두 번째 코드는 matrix*matrix입니다. 다른 operator*은 무엇입니까? 관련없는


, 매개 변수를 허용 할 수있는 세 가지 일반적인 방법은 T, const T&, 또는 T&& 있습니다. const T 매개 변수 유형을 사용할 이유는 거의 없습니다. 너 &가 빠진 것 같아?

+0

제'matrix' 클래스에는'operator * (const matrix)'가 정의되어 있습니다 만, 위의 예제에서는 그것을 호출하지 않는다고 생각합니다. 제안 된 코드를 사용하려고합니다. – OSE

2

TU은 동일하지만 V 유형을 언급하는 함수 프로토 타입에는 주목할만한 것이 없습니다.

반환하는 B 선언에 V을 사용하고 반환 유형을 T() * U()로 정의한다고 생각하면 matrix<V>이 무엇인지 궁금합니다.

내가 처음이었고, 또한 내가 사용하여 종료 된 솔루션을 제공하기 때문에 나는이 대답을 받아 (즉, 매개 변수 목록에 있으면 안)