템플릿 기본 인수


151

다음을 수행 할 수있는 경우 :

template <typename T = int>
class Foo{
};

메인에서 다음을 수행 할 수없는 이유는 무엇입니까?

Foo me;

그러나 다음을 지정해야합니다.

Foo<int> me;

C ++ 11은 기본 템플릿 인수를 도입했으며 지금은 완전히 이해하기가 어렵습니다.

답변:


188

너가해야되는:

Foo<> me;

템플릿 인수가 있어야하지만 비워 둘 수 있습니다.

foo하나의 기본 인수가 있는 함수처럼 생각하십시오 . 표현 foo은 그것을 부르지 않을 것이지만 foo()의지 할 것입니다. 인수 구문은 여전히 ​​존재해야합니다. 이것은 그것과 일치합니다.


4
나는 경우가 불필요한 합병증을 만들 것입니다 가정 @Pubby Foo 수있는 템플릿 식별자 또는 수있는 기본 인수가 있는지 여부에 따라 명시 적 인스턴스화합니다. 명시 적 인스턴스화 구문을 유지하는 것이 좋습니다. foo기본 매개 변수가 하나 인 함수처럼 생각하십시오 . 당신은 그것을 좋아 호출 할 수 없습니다 foo당신이 그것을 호출합니다 foo(). 이것을 일관성있게 유지하는 것이 합리적입니다.
Joseph Mansfield

2
@sftrabbit이지만 인수가없는 함수를 호출 할 수는 없습니다 foo. Foo그러나 인수없이 클래스 이름을 지정할 수 있습니다 .
세스 카네기

4
@aschepler 함수를 사용하면 함수 인수에서 템플릿 인수를 추론 할 수 있습니다. 클래스를 사용하면 기본 인수가 포함 된 템플릿 클래스인지 아니면 비 템플릿 클래스인지를 결정할 수 없습니다.
Olaf Dietsche

21
@OlafDietsche 그러나 이름이 같은 템플릿 클래스와 템플릿이 아닌 클래스를 가질 수 없으므로 컴파일러는 이름이 무엇인지 확인하여 결정할 수 있어야합니다.
세스 카네기

7
@Pubby 표준위원회도 같은 질문을했습니다. 이제 C ++ 17에서는 <>이 경우 더 이상 필요하지 않습니다. 자세한 내용은 답변을 확인하십시오.
Paolo M

53

C ++ 17을 사용하면 실제로 할 수 있습니다.

이 기능을 클래스 템플릿 인수 공제 라고 하며 템플릿 형식의 변수를 선언 할 수있는 방법에 유연성을 추가 합니다 .

그래서,

template <typename T = int>
class Foo{};

int main() {
    Foo f;
}

이제 합법적 인 C ++ 코드 입니다.


5
이상한. C ++ 17 프로젝트에서 시도했지만 작동하지 않았습니다. "템플릿 자리 표시 자 유형 'const MyType'뒤에 간단한 선언자 ID가 와야합니다." GCC 7.3.0을 사용하고 있습니다.
Silicomancer

1
@Silicomancer 코드와 명령 줄을 보지 않으면 말하기가 어렵습니다 ... 아마도 여기 같은 포인터를 다루고 있습니까?
Paolo M

1
Clang은 그것을 받아들이지 않는 것 같습니까? coliru.stacked-crooked.com/a/c5d3c0f90ed263c2
Borgleader

1
@Borgleader 분명히 Coliru는 clang 5.0을 사용하고 있습니다. 이것 에 의해 판단 하면 C ++ 17 템플릿 인수 공제를 지원해야하지만 분명히 id는 지원하지 않습니다. clang 7.0을 사용하여 완드 박스 에서 동일한 예를 시도하면 완벽하게 작동합니다.
Paolo M

2
@PaoloM 오, 멋진 컴파일러 버전 문제를 알게되어 기쁘다. 이것을 조사해 주셔서 감사합니다.
Borgleader

19

당신은 그렇게 할 수 없지만 당신은 이것을 할 수 있습니다

typedef Foo<> Fooo;

그리고 나서

Fooo me;

기본 유형과 다음에 기본 유형이없는 차이점이 typedef Foo<float> Fooo;있습니까?
qrikko

5
C ++ 11-ish 방식은 말할 것입니다using Fooo = Foo<>;
Adrian W

18

다음을 사용할 수 있습니다.

Foo<> me;

그리고 int템플릿 논쟁이 되십시오. 각도 괄호는 필요하며 생략 할 수 없습니다.


이해하기 쉽고 감사하지만 아래에 언급 된 것처럼 유형에 지정된 유형이없는 이유는 무엇입니까?
user633658

@ user633658 : "유형 지정자"를 의미 했습니까? 잘 모르겠습니다
Andy Prowl 23.02의

어쨌든, 빈 꺾쇠 괄호가 필요한 이유 뒤에, 나는 추측을 할 수 있으며, 템플릿 이름 만 사용하여 가능한 모호성을 배제하는 것에 관한 것이지만, 나는 정확한 것을 모른다고 고백해야한다. 이유
앤디 프롤

<>에 대한 요구 사항은 컴파일러의 파서가 foo라는 템플릿이 아닌 foo라는 템플릿 클래스를 참조하고 있는지 확인하는 것입니다.
Mac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.