인프런 커뮤니티 질문&답변

yoodud님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C++

13.8 멤버 함수를 한 번 더 템플릿화 하기

Template한 A클래스의 생성자에 const T& input 부분 질문 있습니다.

작성

·

25

1

강의를 보다보니 class A의 생성자 A(const T& input) : m_value(input) 을 해서 print 함수를 호출하면 쓰레기값이 나오고 있습니다.

분명 코드에선 문제가 없는 것 같아 일반 클래스에서 확인해 보니

일반 클래스에서는 저렇게 A(const T& input을 하여도 문제 없이 123값이 출력 되는 것을 확인했습니다.

 

그래서 저 부분의 문제가 뭘까 하고 템플릿 클래스 생성자에 매개변수에 '&'를 지우고 컴파일을 하니 '123'값이 정상적으로 잘 출력 되더라구요.

강의에서는 문제가 없이 정상적으로 출력 되는데 제 컴퓨터에서는 저리 컴파일 결과가 나오네요.

문제가 무엇일까요?

화면 캡처 2024-11-06 001621.png.webp

?

#include<iostream>
using namespace std;

// 멤버 함수를 한번 더 템플릿화하기 Templatize

template<class T>
class A
{
private:
	T m_value;
public:
	A(const T& input)
		:m_value(input)
	{

	}

	// doSomething 함수에서 또 템플릿을 함
	template<typename TT>
	void doSomething()
	{
		cout << typeid(T).name() << " " << typeid(TT).name() << endl;
	}

	void print()
	{
		cout << "class A::m_value : " << m_value << endl;
	}
};

class B
{
private:
	int m_value;
public:
	B(const int& input) : m_value(input)
	{}

	void print()
	{
		cout << "class B::m_value : " << m_value << endl;
	}
};

int main()
{
	A<int> a_int(123);
	B b_int(123);
	a_int.print();
	b_int.print();

	a_int.doSomething<float>();


	return 0;
}

 

답변 2

1

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

혹시나 해서, 제 환경(Windows&MSVS2022)에서 Debug, Release 모드 변경, 최적화 수준 변경 등 여러가지 시도를 해보며 질문자님의 문제를 재현해보려 했지만 계속 정상적으로 동작이 되네요. 😭
컴파일러와 운영체제도 변경해보며 테스트해보았지만 잘 동작합니다.

& 참조자를 제거하고 해결되셨으니, 참조 과정에서 문제가 생긴 것은 맞아보입니다.
혹시, 이전에 주신 질문과 연관지어서 이전 강의를 학습하시며 생성하신 파일들 중 '템플릿화 된 클래스 A'가 있는 파일을 같이 빌드하신 것은 아니신지, 헤더 파일 분리 혹은 프로젝트 종속성을 통해 확인해보시면 좋을 것 같습니다.

혹시 해결이 안되신다면 다른 문제의 원인이 무엇일지 꾸준히 찾아보고 말씀드리겠습니다.

yoodud님의 프로필 이미지
yoodud
질문자

ㅡㅜ.. 이렇게 열심히 확인 후 답변을 해주시니 너무 감사 드립니다.
말씀 하신 내용 중 A 가 있는 파일이 있어서 그런 게 맞는 것 같습니다.
정성스러운 답변 항상 감사 합니다!
좀 더 좋은 질문을 할 수 있는 학생이 되야겠습니다! ㅎㅎ 😃

문제가 해결되셔서 다행입니다.

질문은 편하게 주세요!

응원 많이 하겠습니다. 😀😁 화이팅!

0

안녕하세요, 인프런 AI 인턴입니다. yoodud님, 템플릿 클래스에서의 문제에 대해 질문 주셨군요.

먼저, 코드 문제 이해를 돕기 위해 몇 가지 점을 짚어보겠습니다. A(const T& input)에서 const T&는 입력 변수를 상수 참조로 받아들이는 형태입니다. 이는 일반적으로 성능을 향상시키고 불필요한 복사를 피하기 위한 것이지만, 사용자의 컴파일러 설정이나 최적화 옵션에 따라 의도치 않은 결과가 발생할 수 있습니다.

  1. 템플릿 클래스에서의 참조 문제: 템플릿 클래스는 컴파일 타임에 인스턴스화되며, 컴파일러에 따라 미세한 차이가 생길 수 있습니다. 특히, 상수 참조(const T&)가 문제의 원인이 된다면, 컴파일러는 이와 관련된 특정 최적화 또는 내부 처리 방식 때문일 수 있습니다.

  2. 컴파일러 차이: 사용 중인 컴파일러의 버전이나 설정에 따라서, 컴파일러가 코드를 어떻게 처리하는지에 대한 미묘한 차이가 결과에 영향을 줄 수 있습니다. 만약 대입된 값이 메모리에 제대로 저장되지 않거나, 참조가 올바르게 동작하지 않는다면, 이런 환경적 차이로 인한 문제일 가능성이 있습니다.

  3. 불확정 값 출력: -858993460와 같은 값은 일반적으로 초기화되지 않은 변수를 출력할 때 자주 보이는 현상입니다. 하지만, 주어진 코드에서는 이러한 문제가 없어 보입니다. 따라서 실제 문제의 원인은 다른 위치에 있을 수 있습니다.

  4. 참조 제거 시 해결: 템플릿 클래스 생성자에서 &를 제거했을 때 올바르게 동작한다면, 이는 참조 처리 과정에서의 문제로 보일 수 있습니다. 참조를 사용할 필요가 없는 경우, 단순 값으로 받아서 사용하는 것도 좋은 해결책일 수 있습니다.

추가로, 아래의 링크에서 비슷한 문제를 다루고 있는 다른 사용자의 질문을 확인할 수 있습니다:
- C++ 템플릿 클래스에서 참조 생성자와 불확정 변수 출력 문제

이미지와 코드 정보를 통해 문제를 정확히 이해하는 데 더 도움이 될 수 있으니, 이미지나 코드 스니펫을 공유해 주시면 추가적인 도움을 드릴 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

yoodud님의 프로필 이미지

작성한 질문수

질문하기