2011-02-09 8 views
13

다음 코드는 엑스 코드에서 컴파일 오류가 발생하는암시 템플릿 매개 변수

template <typename T> 
struct Foo 
{ 
    Foo(T Value) 
    { 
    } 
}; 

int main() 
{ 
    Foo MyFoo(123); 
    return 0; 
} 

error: missing template arguments before 'MyFoo'

Foo MyFoo(123);Foo<int> MyFoo(123);에 대한 수정 문제를 변경,하지만하지 컴파일러는 적절한 알아낼 수있을 것 데이터 형식?

이것은 컴파일러 버그입니까? 아니면 암시 적 템플릿 매개 변수를 잘못 이해합니까?

Foo MyFoo(123); 

MyFoo위한 임시 공간을 할당하고, 알고하기 위해 MyFoo의 완전한 유형을 알고 있어야합니다

답변

11

생성자는 이론적으로는 건설 된 개체의 유형,하지만 문을 추론 할 수있다 얼마나 많은 공간이 필요한지.

당신은 특히 복잡한 템플릿의 이름을 (손가락으로 예) 입력을 피하고 싶은 경우 typedef가 사용을 고려하십시오을 가지고

typedef std::map<int, std::string> StringMap; 

또는 C++ 0X에

당신이 auto 키워드를 사용할 수 있습니다 컴파일러 사용 유 형 추론 - 많은 사람들이이 코드를 사용하여 읽기 쉽지 않고 오류가 발생하기 쉬운 코드를 만들 것이라고 주장하지만, ; P

+5

,이 공간을 추론 할 수있다. –

+6

생성자에 대한 호출 유형을 유추 할 수 있지만 저장 공간은 유추 할 수 없습니다. 변수를'Foo'로 정의하면'Foo '과'Foo '를 모두 가질 수 있습니까? 아니면 항상 비밀리에 'Foo '을 마음 속에두고 있다는 것을 알고 있습니까? 변수가'const'이라면 값을 재 할당 할 수 없기 때문에 구현 될 수 있습니다. 그런 다음'const T'와'T'에 대해 서로 다른 어휘 규칙이 생기고 커다란 혼란이 이어질 것입니다. –

7

컴파일러가없는 클래스/구조체

+3

결국 클래스'std :: pair 를 가지고 있더라도'std :: make_pair (T t, U u)'함수에 대한 이유가 있습니다. '. –

2

그것은 버그가 아니에요을 위해, 단지 템플릿 기능 템플릿 매개 변수 유형을 알아낼 수, 그것은 존재하지 않는 기능입니다. 인스턴스화 중 클래스/구조 템플리트 인수를 완전히 지정해야합니다. 유형은 유 형 템플리트의 경우와 같이 유추되지 않습니다.

2

컴파일러는 템플릿 인수 이러한 경우를 추론 할 수 있습니다

template<typename T> 
void fun(T param) 
{ 
    //code... 
} 

fun(100); //T is deduced as int; 
fun(100.0); //T is deduced as double 
fun(100.0f); //T is deduced as float 

Foo<int> foo(100); 
fun(foo); //T is deduced as Foo<int>; 

Foo<char> bar('A'); 
fun(bar); //T is deduced as Foo<char>; 

사실 템플릿 인수 공제가 큰 주제입니다. ACCU에서이 기사를 읽기 : 푸 T는 타입이고,뿐만 아니라 Foo<T> 클래스와 같이

The C++ Template Argument Deduction

0

그것은, 그것은이처럼 많은 이해된다.

C++ 0x에서는 auto를 사용할 수 있으며 Foo가되도록 foo (소문자 f)라고하는 함수를 만들 수 있습니다. 그런 다음 C++ 11에서

template<typename T> Foo<T> foo(int x) 
{ 
    return Foo<T>(x); 
} 

auto myFoo = foo(55); 
+0

아마 당신은 " Foo foo (T x)"템플릿을 의미할까요? –

2

할 것입니다 당신은 decltype을 사용할 수 있습니다 :이 유형을 추론 할 수 있다면

int myint = 123; 
Foo<decltype(myint)> MyFoo(myint); 
관련 문제