생성자가 템플릿 인수를 추론 할 수없는 이유는 무엇입니까?
이 질문에 이미 답변이 있습니다.
template< class T >
class Foo {
public:
Foo( T t ) { }
};
int main () {
int i = 0;
Foo f( i );
}
위 코드에서 컴파일러는 'f'앞에 템플릿 인수가 없다고 불평합니다. 생성자에 대한 인수에서 클래스에 대한 템플릿 인수를 추론하는 것이 표준의 일부가 아니라는 것을 이해하지만 제 질문은 그 이유입니까? 컴파일러가 암시 적으로 인스턴스화 Foo<int>
하고 생성자를 호출하는 데 필요한 모든 정보를 가지고 있지 않습니까?
그것은 내가 가진 생성자를 호출하고있어 분명하게 편집 int
(A 반대로 short
, long
, void*
, 등)
그것이 정확히 어떻게 작동하는지 아무도 지정하지 않았기 때문입니다. 표준위원회에이를 작동시키기위한 현재 제안이 있습니다. 또한 몇 가지 어려움을 나열합니다.
http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4471.html
업데이트 : 제안의 최신 버전은 다음과 같습니다.
http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/p0091r0.html
TL; DR : 템플릿 전문화
형식이 아닌 함수 자체에 대한 템플릿 인수 만 가능합니다.
Foo f(0);
라는 유형이 없기 때문에 선언 이 잘못되었습니다 Foo
. 아마도 당신은
auto f = Foo(0);
그러나 컴파일러가 검색 할 범위를 알지 못하기 때문에 허용되지 않습니다 (이름이 지정된 생성자 Foo
와 특수 화가있는 무한한 잠재적 유형이 있으며 생성자가 있는 둘 이상일 수 있음 Foo(int)
)
이를 수행하는 일반적인 방법은 공장 도우미 기능을 사용하는 것입니다.
auto f = make_foo(0);
팩토리 함수의 반환 유형은 매개 변수의 유형 추론에 따라 달라집니다.
팩토리 함수가 네임 스페이스 범위에서 자동으로 생성 된 다음 일반적인 함수 오버로딩 규칙이 적용될 수 있다고 상상할 수 있지만 형식과 생성자 자체 모두에 템플릿 인수가있을 수 있기 때문에 이것은 상당한 어려움이 있습니다. 유형 매개 변수가 끝나는 위치와 함수 매개 변수가 시작되는 위치를 구별 할 방법이 없기 때문에 가변 인수 목록이있는 클래스 템플릿을 제외한다는 제한을 가지고 간단히 연결할 수 있습니다.
Foo
클래스가 아닌 클래스 템플릿 입니다. 클래스가 올바른 유형으로 생성 되려면 해당 유형이 항상 어떤 방식 으로든 제공되어야합니다. 유형이 아니기 Foo
때문에 할 수 없지만 그렇습니다 . 다음과 같은 클래스를 생성합니다.Foo
Foo<int>
class Foo {
public:
Foo( int t ) { }
};
만 제공 Foo
하면 컴파일러는 클래스를 생성하는 방법을 알지 못합니다. Foo<int> f(0)
때문에 작동 Foo<int>
대체하여 클래스를 생성 T
하여 int
. 생성자를 호출하는 유형에 따라 컴파일러는 생성자가 int
.
인스턴스화하려는 클래스의 이름은 Foo<int>
(표시 한대로)입니다.
Foo<short> f(0)
, 또는 Foo<unsigned long> f(0)
, 또는를 쓸 수도 있습니다 Foo<Foo<double>*> f(0)
. 그러나 이러한 경우에만 작성하는 경우 컴파일러가 유형을 추측 할 수있을 것으로 기대하지 않습니다 Foo f(0)
.
특정 방식 (예 : 리터럴은 유형 매개 변수를 의미 하고 다른 것은 없음을 의미 함) 으로 이러한 추측을 수행하는 규칙으로 C ++를 지정할 수 있다고 상상할 수 있지만 언어는 지금보다 훨씬 더 복잡 할 것입니다. 사람들이 프로그래밍 오류를 만들 수있는 추가적인 방법이됩니다. 실제로 이와 같은 선언에서 당신이 의미하는 바를 쓰는 것은 너무 많이 묻지 않는 것처럼 보입니다.0
int
편집 : 이 게시 한 후, 내가 거기에 또 다른 대답에 발견 입니다 상상할 수 있기 때문에 실제로 C ++의 이러한 기능을 만들 수있는 제안.
참고 URL : https://stackoverflow.com/questions/29677505/why-cant-constructors-deduce-template-arguments
'Programing' 카테고리의 다른 글
.csproj 파일의 기능은 무엇입니까? (0) | 2020.12.13 |
---|---|
웹 API 생성 API 키 (0) | 2020.12.13 |
대기열 크기 제한 (0) | 2020.12.13 |
통합 테스트에 필요한 데이터베이스 데이터 (0) | 2020.12.13 |
다중 통화 모범 사례 및 구현 (0) | 2020.12.13 |