작성
·
25
1
강의를 보다보니 class A의 생성자 A(const T& input) : m_value(input)
을 해서 print 함수를 호출하면 쓰레기값이 나오고 있습니다.
분명 코드에선 문제가 없는 것 같아 일반 클래스에서 확인해 보니
일반 클래스에서는 저렇게 A(const T& input
을 하여도 문제 없이 123값이 출력 되는 것을 확인했습니다.
그래서 저 부분의 문제가 뭘까 하고 템플릿 클래스 생성자에 매개변수에 '&'를 지우고 컴파일을 하니 '123'값이 정상적으로 잘 출력 되더라구요.
강의에서는 문제가 없이 정상적으로 출력 되는데 제 컴퓨터에서는 저리 컴파일 결과가 나오네요.
문제가 무엇일까요?
?
#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
'가 있는 파일을 같이 빌드하신 것은 아니신지, 헤더 파일 분리 혹은 프로젝트 종속성을 통해 확인해보시면 좋을 것 같습니다.
혹시 해결이 안되신다면 다른 문제의 원인이 무엇일지 꾸준히 찾아보고 말씀드리겠습니다.
0
안녕하세요, 인프런 AI 인턴입니다. yoodud님, 템플릿 클래스에서의 문제에 대해 질문 주셨군요.
먼저, 코드 문제 이해를 돕기 위해 몇 가지 점을 짚어보겠습니다. A(const T& input)
에서 const T&
는 입력 변수를 상수 참조로 받아들이는 형태입니다. 이는 일반적으로 성능을 향상시키고 불필요한 복사를 피하기 위한 것이지만, 사용자의 컴파일러 설정이나 최적화 옵션에 따라 의도치 않은 결과가 발생할 수 있습니다.
템플릿 클래스에서의 참조 문제: 템플릿 클래스는 컴파일 타임에 인스턴스화되며, 컴파일러에 따라 미세한 차이가 생길 수 있습니다. 특히, 상수 참조(const T&
)가 문제의 원인이 된다면, 컴파일러는 이와 관련된 특정 최적화 또는 내부 처리 방식 때문일 수 있습니다.
컴파일러 차이: 사용 중인 컴파일러의 버전이나 설정에 따라서, 컴파일러가 코드를 어떻게 처리하는지에 대한 미묘한 차이가 결과에 영향을 줄 수 있습니다. 만약 대입된 값이 메모리에 제대로 저장되지 않거나, 참조가 올바르게 동작하지 않는다면, 이런 환경적 차이로 인한 문제일 가능성이 있습니다.
불확정 값 출력: -858993460
와 같은 값은 일반적으로 초기화되지 않은 변수를 출력할 때 자주 보이는 현상입니다. 하지만, 주어진 코드에서는 이러한 문제가 없어 보입니다. 따라서 실제 문제의 원인은 다른 위치에 있을 수 있습니다.
참조 제거 시 해결: 템플릿 클래스 생성자에서 &
를 제거했을 때 올바르게 동작한다면, 이는 참조 처리 과정에서의 문제로 보일 수 있습니다. 참조를 사용할 필요가 없는 경우, 단순 값으로 받아서 사용하는 것도 좋은 해결책일 수 있습니다.
추가로, 아래의 링크에서 비슷한 문제를 다루고 있는 다른 사용자의 질문을 확인할 수 있습니다:
- C++ 템플릿 클래스에서 참조 생성자와 불확정 변수 출력 문제
이미지와 코드 정보를 통해 문제를 정확히 이해하는 데 더 도움이 될 수 있으니, 이미지나 코드 스니펫을 공유해 주시면 추가적인 도움을 드릴 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
ㅡㅜ.. 이렇게 열심히 확인 후 답변을 해주시니 너무 감사 드립니다.
말씀 하신 내용 중 A 가 있는 파일이 있어서 그런 게 맞는 것 같습니다.
정성스러운 답변 항상 감사 합니다!
좀 더 좋은 질문을 할 수 있는 학생이 되야겠습니다! ㅎㅎ 😃