2017-09-04 2 views
2

변수 템플릿에 대한 경고가 C++ 11에 표시됩니다. 나는 그들이 필요하다는 것을 완전히 확신하지 못한다. 왜냐하면 나는 그들이 무엇인지 확신 할 수 없기 때문이다. References that I've found은 용어를 사용하기 전에 용어 정의가 필요하지 않습니다. 내 즉각적인 생각은 템플릿 기반 형 T이다 변수를 선언하기위한 시도라고했지만,이 코드는 잘 컴파일 :변수 템플릿이란 정확히 무엇입니까

변수 템플릿의 철저한 정의이며, 왜이없는 무엇
template <class T> 
image<T> *image<T>::copy() const { 
    image<T> *im = new image<T>(w, h, false); 
    memcpy(im->data, data, w * h * sizeof(T)); 
    return im; 
} 

변수 템플릿 문제

+4

여기에 [변수 템플릿] (http://en.cppreference.com/w/cpp/language/variable_template)이 있습니다. [cppreference.com] (http://en.cppreference.com/w/). – Ron

+0

나는이 사이트를 보았고 특별히 도움이되지 않았다. 그것은 "변수 템플릿 변수 또는 정적 데이터 멤버의 가족을 정의합니다." 몇 가지 예가 있습니다. 내 예제의 코드는 나에게 cppreference에 대한 정의의 제한된 정보를 기반으로하는 추가 예제로 보입니다. 왜 그렇지 않은가? – Scott

+0

이것은 변수 템플릿처럼 보이지 않습니다. 멤버 함수 템플릿과 비슷합니다. – VTT

답변

7

클래스 템플릿은 하나 이상의 템플릿 매개 변수를 기반으로 일련의 클래스를 정의하는 템플릿입니다. 함수 템플리트는 하나 이상의 템플리트 매개 변수를 기반으로 일련의 함수를 정의하는 템플리트입니다. vector은 템플릿 클래스입니다. vector<int>은 해당 템플릿에서 인스턴스화 된 특정 클래스입니다.

template<typename T> 
T variable_name{}; 

가변 템플릿이다

가변 템플릿은 하나 개 이상의 템플릿 파라미터에 기초 변수 시리즈를 정의하는 템플릿, 따라서이다. 다른 템플릿과 마찬가지로 원하는 템플릿을 지정할 수 있습니다. variable_name<int>int입니다. variable_name템플릿입니다. variable_name<int>은 실제로 변수입니다.

물론, 당신은 더 복잡한 일을 수행 할 수 있습니다

template<typename T> 
vector<T> vector_var{}; 

vector_var<int>vector<int>이다.

변수 템플릿은 namespace/global 범위 및 클래스의 정적 멤버로만 제공 될 수 있습니다. 네임 스페이스/전역 범위에서 이들은 보통 constexpr (및/또는 C++ 17, inline)으로 선언됩니다. 그들은 상수를 만들기위한 유용하다 : 당신이 뭔가 기본 작도 경우 말하고 싶은 경우

template<typename T> 
inline constexpr bool is_default_constructible_v = std::is_default_constructible<T>::value; 

그래서, 당신은 약간 어색한 ::value 구문이 필요하지 않습니다.

가변 템플릿은 C++ 14 기능이므로 컴파일러에서 아마도 C++ 11 모드에서 사용하도록 경고했을 것입니다.

image<T> *im = new image<T>(w, h, false); 


하지 변수 템플릿 입니다. 이것은 형식이 매우 잘 정의 된 정규 변수입니다 (image<T>). 정확히 하나의 변수 "im"이 있습니다. 변수를 얻으려면 im<T>을 사용하지 마십시오.

이 문은 변수 집합을 정의하지 않습니다. 당신이 가지고있는 가족은 입니다.이고, 각각 에는이라는 변수와 im이라는 변수가 있습니다. 이 함수는 변수가 아니라 템플릿입니다.

+0

이것은 분명합니다. 내 특정 위반 코드는 함수 매개 변수입니다 :'std :: unordered_map * counter' 이것은'image * im'을 선언 할 때와 같은 형식을 가지고 있습니다. – Scott

+0

@Scott : 귀하의 질문은 " 변수 템플릿 "에 대한 경고를주는 이유는 무엇입니까? 그것이 당신이 알고 자하는 것이면, 당신은 그 질문을해야합니다. 그러나 이것을 바꾸지 마십시오. 그리고 그 질문을하는 경우 문제를 재현하는 코드와 함께 사용중인 컴파일러 (컴파일러의 버전 번호 포함) 및 컴파일러 스위치를 제공하십시오. –

+0

나는 질문을 전혀 변경하지 않았다. 사실, 그 질문은 "가변적 인 템플릿은 무엇인가"로 더 낫다고 생각했기 때문에 나는 그대로두고 논평으로 나의 계속되는 혼란을 언급했다. – Scott

관련 문제