2017-11-19 23 views
1

"C++ 템플릿, 전체 가이드"5 장을 읽었으며 "템플릿 템플릿"템플릿 개념을 보았습니다. 템플릿 클래스에서 템플릿 템플릿 (C++ 11 오류)

, 난 이렇게 내 템플릿을 선언했습니다

template <typename TipoClave, typename TipoDato, 
     template <class Elem, class Alloc = allocator<Elem>> class Lista = vector> 

그리고이 작동합니다. 내 문제는 기본값 이외의 다른 컨테이너를 사용하려고 할 때 발생합니다.

class Tabla 
{ 
public: 
    struct Celda { 
     TipoClave clave; 
     TipoDato dato; 
    }; 

    Tabla(unsigned tam) 
    { 
     t.resize(tam); 
    } 

///< Some other functions 

private: 
    typedef Lista<Celda> ListaDatos; 
    Lista<ListaDatos> t; 
}; 

그리고이 후, 나는이 같은 메인 프로그램에서 사용하려고 할 때 :

int main (void) 
{ 
    Tabla<string,Alumno,array> tabla(200); 
    ///< Some stuff 

    return 0; 
} 

그러나이 줄 Tabla<string,Alumno,array> tabla(200); 컴파일하지 않고, 저를 받고 다음과 같이

내 클래스입니다 같은 오류 :

test_tabla_t.cpp: In function ‘int main()’: test_tabla_t.cpp:20:27: error: type/value mismatch at argument 3 in template parameter list for ‘template class Lista> class Tabla’ Tabla tabla(200);

나는 Tabla<string,Alumno,vector> tabla(200);을 사용해 보았습니다. 그것은 작동하므로이 오류를 해결하는 방법을 모르겠습니다.

답변

2

std::array을 사용한다고 가정 할 때 할당 자 템플릿 매개 변수를 사용하지 않습니다. 두 번째 인수는 배열의 크기입니다. 당신은 어떻게 당신이 C++로,하지만 당신은 더 많은 것을 배우려고 노력하고 있기 때문에, 나는 거의 10 년을위한 C++를 사용하고 한 손에 의지 할 수 있음을 말할 것이다 경험 언급하지 않은

template< 
    class T, 
    std::size_t N 
> struct array; 

템플릿 템플릿 매개 변수를 사용한 횟수

이 경우 Lista을 "시퀀스 컨테이너 [1]처럼 동작하는"것으로 원한다면 [2] 개념을 읽고 C++로 만들 수 있습니다. 그것들은 템플릿 매개 변수가 갖기를 원하는 인터페이스를 컴파일러에 알릴 수 있도록합니다.

한편 Lista를 일반 템플릿 매개 변수로 선언하는 것이 더 쉽습니다.

[1] http://en.cppreference.com/w/cpp/concept/SequenceContainer
[2] https://en.wikipedia.org/wiki/Concepts_(C%2B%2B)