-1
#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;
};

上記のコードをコンパイルすると、以下のエラー メッセージが表示されます。

$ 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>意味ですか? 削除できないのはなぜですか?

4

2 に答える 2

1

TemplateClass単一の型引数を取るテンプレートであることをコンパイラに伝えました。

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

さて、 を使用するためにTemplateClassは、その引数が何であるかをコンパイラに伝える必要があります (例: TT2、などint) 。std::string

于 2013-03-23T09:16:35.113 に答える
1
template <typename T> class TemplateClass

テンプレートTemplateClassクラスです。テンプレートは、必要な型を提供するまでは不完全なクラスです。この場合、提供する必要がありますT

于 2013-03-23T09:18:06.967 に答える