2013-03-23 39 views
0
#include <stdio.h> 

template<typename T, typename T2, template <typename T> class TemplateClass> 

class TemplateTemplateClass { 
public: 
    TemplateTemplateClass(const TemplateClass& tempClass) 
     : _internalClass(tempClass) { 
    } 

    void doTest() { 
     _internalClass.doTest(); 
    } 
private: 
    TemplateClass _internalClass; 
}; 

上面的代碼編譯會給以下錯誤消息時:錯誤是什麼意思?關於C++模板參數

$ g++ TemplateTemplateClass.cpp 
TemplateTemplateClass.cpp:7:33: error: invalid use of template-name 'TemplateClass' without an argument list 
TemplateTemplateClass.cpp:7:48: error: ISO C++ forbids declaration of 'tempClass' with no type [-fpermissive] 
TemplateTemplateClass.cpp:15:5: error: invalid use of template-name 'TemplateClass' without an argument list 
TemplateTemplateClass.cpp: In constructor 'TemplateTemplateClass<T, T2, TemplateClass>::TemplateTemplateClass(const int&)': 
TemplateTemplateClass.cpp:8:11: error: class 'TemplateTemplateClass<T, T2, TemplateClass>' does not have any field named '_internalClass' 
TemplateTemplateClass.cpp: In member function 'void TemplateTemplateClass<T, T2, TemplateClass>::doTest()': 
TemplateTemplateClass.cpp:12:9: error: '_internalClass' was not declared in this scope 

如果我改變它像下面那麼就可以編譯成功。

class TemplateTemplateClass { 
public: 
    TemplateTemplateClass(const TemplateClass<T>& tempClass) 
     : _internalClass(tempClass) { 
    } 

    void doTest() { 
     _internalClass.doTest(); 
    } 
private: 
    TemplateClass<T> _internalClass; 
}; 

因此,考慮上面的錯誤消息,我的問題是,在TemplateClass<T>,這是什麼意思<T>?爲什麼它不能被刪除?

+0

你想做[CRTP](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)嗎? – Rapptz

回答

1

你告訴編譯器TemplateClass是採取單一的類型參數的模板:現在

template<typename T, typename T2, template <typename T> class TemplateClass> 
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

,爲了使用TemplateClass,你必須告訴編譯器參數是什麼,例如TT2intstd::string

1
template <typename T> class TemplateClass 

TemplateClass是一個模板類。在您提供所需類型之前,模板是不完整的類。在這種情況下,您應該提供T