문제 :
다음 프로그램은 컴파일 오류가 발생한다. 소스의 어디에서 왜 컴파일 오류가 발생하는가?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle(int radius = 1) { this->radius = radius; }
int getRadius() { return radius; }
};
template <class T>
T bigger(T a, T b) { // 두 개의 매개 변수를 비교하여 큰 값을 리턴
if (a > b) return a;
else return b;
}
int main() {
int a = 20, b = 50, c;
c = bigger(a, b);
cout << "20과 50중 큰 값은 " << c << endl;
Circle waffle(10), pizza(20), y;
y = bigger(waffle, pizza);
cout << "waffle과 pizza 중 큰 것의 반지름은 " << y.getRadius() << endl;
}
|
실행 결과 :
목적 및 힌트 :
템플릿 함수의 구체화의 실패 이해
코드 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle(int radius = 1) { this->radius = radius; }
int getRadius() { return radius; }
};
Circle bigger(Circle a, Circle b){
if(a.getRadius() > b.getRadius())
return a;
return b;
}
template <class T>
T bigger(T a, T b) { // 두 개의 매개 변수를 비교하여 큰 값을 리턴
if (a > b) return a;
else return b;
}
int main() {
int a = 20, b = 50, c;
c = bigger(a, b);
cout << "20과 50중 큰 값은 " << c << endl;
Circle waffle(10), pizza(20), y;
y = bigger(waffle, pizza);
cout << "waffle과 pizza 중 큰 것의 반지름은 " << y.getRadius() << endl;
}
|
설명 :
전체 코드 28번 줄에 있는 y = bigger(waffle, pizza);를 호출 시에 19번 줄에 있는 if(a>b) return a; 부분에서 오류가 발생합니다.
Circle과 같은 클래스는 > 연산자가 구현되어 있지 않기 때문에 구체화에 실패하기 때문입니다.
따라서 Circle 타입의 중복 함수를 작성하여 주면 bigger(waffle, pizza); 호출 시 템플릿 함수보다 중복 함수가 우선이기 때문에 템플릿 함수가 아닌 Circle 객체를 리턴하는 중복 함수가 호출됩니다.
'C++ programming' 카테고리의 다른 글
명품 C++ programming 실습 문제 10장 9번 (1) | 2020.03.10 |
---|---|
명품 C++ programming 실습 문제 10장 8번 (3) | 2020.03.09 |
명품 C++ programming 실습 문제 10장 6번 (1) | 2020.03.09 |
명품 C++ programming 실습 문제 10장 5번 (1) | 2020.03.09 |
명품 C++ programming 실습 문제 10장 4번 (1) | 2020.03.09 |