【发布时间】:2017-07-25 13:41:39
【问题描述】:
假设std::vector 没有value_type。是否可以编写一个模板来推断value_type?或者更笼统地说,给定T<X>,我如何推断X?
一个很幼稚的..
template <template <typename X> T>
void test(T<X> t) {
X x;
}
可能会让对模板有一点了解的人嘲笑我的愚蠢尝试,当像这样实例化时:
int main() {
std::vector<int> x;
test(x);
}
产生以下错误:
error: expected ‘class’ before ‘T’
template < template<typename X> T>
^
error: ‘X’ was not declared in this scope
void test(T<X> u) {
^
error: template argument 1 is invalid
void test(T<X> u) {
^
In function ‘void test(int)’:
error: ‘X’ was not declared in this scope
X x;
^
error: expected ‘;’ before ‘x’
X x;
^
In function ‘int main()’:
error: no matching function for call to ‘test(std::vector<int>&)’
test(x);
^
note: candidate is:
note: template<template<class X> class T> void test(int)
void test(T<X> u) {
^
note: template argument deduction/substitution failed:
note: cannot convert ‘x’ (type ‘std::vector<int>’) to type ‘int’
编辑:第一个很容易修复,但修复它不会影响其他...
PS:我想我有一个小误解,因为std::vector<int> 不是模板,而是具体类型。但是,我仍然想知道是否有办法通过一些模板魔法从someTemplate<int> 获取int。
【问题讨论】:
-
如果我没记错的话,你必须使用
class和嵌套模板。类似template <template <typename X> class T>. -
请注意,
std::vector有第二个(默认)模板参数。 -
一种解决方法,但如果您只是使用容器,您可以获取一个迭代器并使用
std::iterator_traits。