클래스 템플릿에서 정적 멤버 초기화


148

나는 이것을하고 싶다 :

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};

그러나 나는 그 이후 something_relevant로 완전한 유형이 아닙니다. 에 의존하지 T않지만 기존 코드는의 정적 멤버에 의존합니다 S.

S는 템플릿이므로 컴파일 된 파일에 정의를 넣을 수 없습니다. 이 문제를 어떻게 해결합니까?


std::string유형 에도 적용됩니다
Trevor Boyd Smith

c ++ 11부터 키워드 인라인이 변경되어 선언 시점에서 정적 변수를 초기화 할 수 있습니다. 따라서 이에 대한 선언은 "inline static double something_relevant = 1.5;"와 같습니다.

@ user8991265 C ++ 11이 아니라 C ++ 17 이후 인라인 변수를 사용할 수 있다고 생각합니다.
zupazt3

답변:


195

헤더에 정의하십시오.

template <typename T>
struct S
{
    static double something_relevant;
};

template <typename T>
double S<T>::something_relevant = 1.5;

모든 템플릿과 마찬가지로 템플릿의 일부이므로 컴파일러는 한 번만 정의되도록합니다.


4
@ sbi : 하나의 정의 규칙을 위반하지 않습니까?
Alexandre C.

7
아니요, 템플릿을 말하는 경우에는 아닙니다. 그렇지 않으면 함수 템플릿도 그렇게합니다.
sbi

1
@sbi, @Prasoon : 실제로 Prasoon이 첫 번째 것 같습니다. 그러나 나는 ODR (내 주요 관심사)에 대한 의견 때문에 여전히 sbi를 받아들입니다.
Alexandre C.

1
@ sbi는 텍스트 위에 마우스를 올려 놓았습니다 :)
Johannes Schaub-litb

5
@Johannes : 젠장, 나는 1 년 동안 여기에 있었고 그것을 몰랐습니다! 내가 뭘 놓치고 있니? (투표 수를 클릭 할 때 나타나는 두 개의 숫자가 버그가 아니라 기능이라는 것을 발견했을 때 나는 여전히 수치심을 기억합니다.) <goes_playing>와우, 당신의 이름 위에 마우스를 올리면, 당신의 담당자가 보입니다! 나도 몰랐어 @Prasoon : 아니, 당신 말이 맞아, 나는 그것이 지금 어디에 있는지 반복적으로 도착했다. (그래서 내가 당신의 대답을 투표했습니다, BTW.)
sbi


31

이 작동합니다

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;

something_relevant 변수를 정의하지 않았습니다 ( template<typename T> double S<T>::something_relevant=1.5;)컴파일러 던지기 오류를 제거 했습니다. 이유가 무엇인지 말씀해 주시겠습니까?
goodman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.