이 질문은 어제받은 answer에서 비롯됩니다. 다음 함수의 경우 및 U
이 모두 std::complex<double>
인 경우 오류 couldn't deduce template parameter ‘V’
이 표시됩니다. T
과 U
이 다른 경우 함수는 컴파일되고 의도 한대로 작동합니다. 다음과 같이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*
의 또 다른 과부하가 있어야합니다 생각
B 및 반환 형식이 더 V와 함께,
matrix<decltype(declval<T>()*declval<U>())>
될 것으로 기대한다. 세 가지 답변 모두 도움이되었으며 유사한 정보를 제공했습니다. 감사합니다. – OSE'matrix' –
@MooingDuck으로 간단해질 수 있습니다. 'decltype (std :: declval() * std :: decl ())'나는 생각없이 선언 앞에 반사적으로 이동했습니다. 후행 반환 형식으로 단순화하면 가독성이 크게 향상됩니다. 나는 그 대답에 통합 할 것이다. –
Casey