템플릿 기본 인수


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.