C에서는 중첩된 도우미 구조체를 사용하여 정적 멤버를 초기화할 수 있습니다. 이 접근 방식은 템플릿이 아닌 클래스에는 잘 작동하지만 템플릿 매개변수가 있는 클래스에서는 문제가 발생할 수 있습니다.
정적 멤버 초기화 도우미가 템플릿 클래스:
<code class="cpp">struct A { struct InitHelper { InitHelper() { A::mA = "Hello, I'm A."; } }; static std::string mA; static InitHelper mInit; static const std::string& getA() { return mA; } }; template<class T> struct B { struct InitHelper { InitHelper() { B<T>::mB = "Hello, I'm B."; } // [3] }; static std::string mB; static InitHelper mInit; // [4] static const std::string& getB() { return mB; } static InitHelper& getHelper() { return mInit; } };</code>
이 시나리오에서는 다음과 같이 관찰됩니다.
예기치 않은 동작은 정적 멤버 초기화 동작에서 비롯됩니다. 템플릿 클래스. ISO/IEC C 2003 표준(14.7.1)에 따르면 정적 데이터 멤버의 초기화는 정적 데이터 멤버 자체가 해당 정의가 존재해야 하는 방식으로 사용되는 경우에만 발생합니다.
To 암시적 초기화에 대한 의존을 피하고 일관된 초기화 순서를 보장하려면 클래스 템플릿에서 정적 데이터 멤버를 명시적으로 특수화하는 것이 좋습니다. 이 경우:
<code class="cpp">template<> std::string B<int>::mB = "Hello, I'm B (int specialization).";</code>
템플릿 클래스의 각 인스턴스화에 대해 정적 데이터 멤버를 명시적으로 특수화함으로써 초기화가 명시적으로 트리거되고 초기화 도우미에 액세스하지 않고도 원하는 동작이 달성됩니다.
위 내용은 중첩된 도우미 구조체를 사용하여 템플릿 기반 C 클래스의 정적 멤버를 어떻게 안정적으로 초기화할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!