유사한 접근 방식 이 같은 일을하는 것입니다 : 그렇지 않은 경우는 두 컨테이너가 같은 정수 매개 변수를 보장 할 수 있도록하고, 읽을 수있는 오류 메시지가 방출됩니다
template<int I>
class A {};
template<int I>
class B {};
// Forward declaration.
template<typename T, typename U>
class C;
template<template<int> class TA, template<int> class TB, int I, int J>
class C<TA<I>, TB<J>> {
// J exists only to make sure integer parameters match.
static_assert((I == J), "Template parameters' integer parameters are mismatched.");
private:
TA<I> objA;
TB<I> objB;
public:
// ...
};
// ...
C<A<4>, B<4>> ca4b4; // Valid.
C<A<4>, B<16>> ca4b16; // Static assert fails.
.
편집 : 참고로, 별도의 정수 매개 변수를 사용하여 수동으로 덜 이해 "불완전한 유형을"오프 줄 것이다 불일치 템플릿 템플릿 매개 변수와 인스턴스를 만들려고 평등을 확인하지 않는 경우 에러 메시지. 실제 정의는 두 매개 변수는 같은 정수 매개 변수가 인스턴스를 잡을 수있을 것이고, 일치하지 정수 매개 변수를 어떤 용도 대신 불완전 전방 선언, 다시 떨어질 것이기 때문에
template<template<int> class TA, template<int> class TB, int I>
class C<TA<I>, TB<I>> {
// ...
};
// ...
C<A<4>, B<16>> ca4b16; // Oops.
/* Error messages:
* GCC:
* error: aggregate 'C<A<4>, B<16> > ca4b16' has incomplete type and cannot be defined
* C<A<4>, B<16>> ca4b16;
* ^
* MSVC:
* error C2079: 'ca4b16' uses undefined class 'C<T, U>'
* with
* [
* T=A<4>,
* U=B<16>
* ]
*/
이다. 두 개의 개별 정수 매개 변수를 사용하여 수동으로 동등성 검사를 수행하면 잘못된 인스턴스화를 선언에 반환하지 않고 잡을 수 있으므로 일반 오류를 실제로 문제가 무엇인지 알려주는 무언가로 변환 할 수 있습니다.
예 가능합니다. – Jarod42