是否可以使用将模板参数作为模板参数的类型?

时间:2018-07-09 23:37:14

标签: c++ c++11 templates

请考虑以下程序。

#include <vector>
#include <unordered_set>

/**
 * Convert any templated iterable container to a std::unordered_set.
 */
template <typename T>
std::unordered_set<T> vectorToUnorderedSet(const std::vector<T>& container) {
    std::unordered_set<T> set;
    for (T t: container) {
        set.insert(t);
    }
    return set;
}

int main(){
    std::vector<int> vec {1,2,3};
    std::unordered_set<int> set = vectorToUnorderedSet(vec);
}

如果我使用以下命令进行编译,它将编译并正常运行。

g++ -std=c++11 -O3 -Wall -g TemplatePlay.cc -o TemplatePlay -pthread

现在,我想对此功能进行概括,以便它可以将任何模板容器用作输入。

这是我的第一次尝试。

/**
 * Convert any templated iterable container to a std::unordered_set.
 */
template <typename T, typename C>
std::unordered_set<T> containerToUnorderedSet(const C<T>& container) {
    std::unordered_set<T> set;
    for (T t: container) {
        set.insert(t);
    }
    return set;
}

此操作失败,并出现以下错误。

g++ -std=c++11 -O3 -Wall -g TemplatePlay.cc -o TemplatePlay -pthread
TemplatePlay.cc:8:51: error: ‘C’ is not a template
 std::unordered_set<T> containerToUnorderedSet(const C<T>& container) {
                                                   ^
TemplatePlay.cc: In function ‘int main()’:
TemplatePlay.cc:18:60: error: no matching function for call to ‘containerToUnorderedSet(std::vector<int>&)’
     std::unordered_set<int> set = containerToUnorderedSet(vec);
                                                            ^
TemplatePlay.cc:8:23: note: candidate: template<class T, class C> std::unordered_set<T> containerToUnorderedSet(const C&)
 std::unordered_set<T> containerToUnorderedSet(const C<T>& container) {
                       ^~~~~~~~~~~~~~~~~~~~~
TemplatePlay.cc:8:23: note:   template argument deduction/substitution failed:
TemplatePlay.cc:18:60: note:   couldn't deduce template parameter ‘T’
     std::unordered_set<int> set = containerToUnorderedSet(vec);

                                                        ^

接下来,我尝试了this answer中提到的神奇咒语,但是我不理解其语法,因此可能会错误地实现了它。

/**
 * Convert any templated iterable container to a std::unordered_set.
 */
template <typename T, template <typename> class C>
std::unordered_set<T> containerToUnorderedSet(const C<T>& container) {
    std::unordered_set<T> set;
    for (T t: container) {
        set.insert(t);
    }
    return set;
}

这导致了以下错误。

g++ -std=c++11 -O3 -Wall -g TemplatePlay.cc -o TemplatePlay -pthread
TemplatePlay.cc: In function ‘int main()’:
TemplatePlay.cc:18:60: error: no matching function for call to ‘containerToUnorderedSet(std::vector<int>&)’
     std::unordered_set<int> set = containerToUnorderedSet(vec);
                                                            ^
TemplatePlay.cc:8:23: note: candidate: template<class T, template<class> class C> std::unordered_set<T> containerToUnorderedSet(const C<T>&)
 std::unordered_set<T> containerToUnorderedSet(const C<T>& container) {
                       ^~~~~~~~~~~~~~~~~~~~~
TemplatePlay.cc:8:23: note:   template argument deduction/substitution failed:
TemplatePlay.cc:18:60: note:   template parameters of a template template argument are inconsistent with other deduced template arguments
     std::unordered_set<int> set = containerToUnorderedSet(vec);
                                                            ^
Makefile:8: recipe for target 'TemplatePlay' failed
make: *** [TemplatePlay] Error 1

如果可能,定义采用需要模板参数类型的模板化方法的正确方法是什么?

accepted answerquestion claimed as a duplicate不能解决这些编译器错误。

0 个答案:

没有答案