请考虑以下程序。
#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 answer至question claimed as a duplicate不能解决这些编译器错误。