2010-12-13 4 views
5

이 코드를 컴파일 할 수없는 이유를 알지 못합니다. Visual C++ 2010 및 gcc에서 -std = C++ 0x로 테스트했습니다. 누구 제안 좀 줄래? 덕분에 !C++ 0x 참조 축소에 대한 질문

template<typename T> 
class Foo 
{ 
public: 
void test(const T&){cout<<"const";} 
void test(  T&){cout<<"non const";} 
}; 

int main() 
{ 
int a; 
Foo<int&> f; 
} 

컴파일 오류 : '무효 푸 :: 시험 (T)': 멤버 함수는 이미 정의 또는

을 선언하지만,이는 이유를 컴파일 할 수 있습니다?

template<typename T> void foo(const T&){cout<<"const"; } 
template<typename T> void foo(T&){cout<<"non const"; } 
int main() 
{ 
    int a; 
    foo<int&>(a); 
} 

i'v C + +0 기사를 읽고는 말했다 : T & & == T &, 그래서 const를 T & & ==의 CONST T &?

답변

8

이, 기준 인 입력에인가

class Foo<int&> 
{ 
public: 
void test(int&); 
void test(int&); 
}; 

const는 무 조작 없다 :

Foo<int&> f; 

이 인스턴스화를 일으킨다. 비 정적 멤버 함수가 참조 데이터 멤버에서 작동과 비교 :

struct A { 
    int &ref; 

    // valid: const member function doesn't treat "ref" as "const int&". 
    void operate() const { 
    ref = 0; 
    } 
}; 

당신은 당신의 목표를 달성하기 위해 Foo<...>int을 통과해야합니다.

13

i'v read c++0x article said: T& & ==T& , so const T& & == const T& ?

사실, 그건별로 의미가 없습니다. IMHO, 그것은 테이블에이를 넣어하는 것이 좋습니다 :

T  T&  const T  const T& 
--------------------------------------- 
int  int& const int const int& 
int& int& int&   int& 
     (1)  (2)   (1+2) 

1: Reference collapsing in action 
2: const applies to the reference and is therefore ignored 

를 T 이미 참조 (2 행) const T의 CONST는 심판에 참조에 적용되지 않습니다. 그러나 참조는 초기화 후에 다른 객체를 참조 할 수 없다는 의미에서 본질적으로 일정하므로 여기서는 const을 무시합니다. 당신은 "const collapsing"이라고 생각할 수 있습니다. ;-)

1

두 번째 질문의 경우 두 개의 인스턴스화 된 함수는 동일한 매개 변수 유형을 가지며 두 매개 변수는 모두 템플릿입니다 (템플릿이 아닌 템플릿 함수 인 경우 오버로드 해결 방법은 이후 템플릿을 선택합니다).), 과부하 해결은보다 전문화 된 템플릿을 선택할 것입니다. 일반적으로 const T &은 T &보다 특수화 된 형식이므로 첫 번째 템플릿 함수가 호출됩니다.