C++ 在C+;中将typename用作函数参数时,如何传递引用+;?
我对模板有一些奇怪的问题。当试图传递参数化迭代器时,它会抱怨找不到函数。代码片段就在这里,忘了功能吧,我感兴趣的是它使用了对模板化迭代器的引用C++ 在C+;中将typename用作函数参数时,如何传递引用+;?,c++,templates,C++,Templates,我对模板有一些奇怪的问题。当试图传递参数化迭代器时,它会抱怨找不到函数。代码片段就在这里,忘了功能吧,我感兴趣的是它使用了对模板化迭代器的引用 #include <list> #include <iostream> template<typename T> void print_list_element(typename std::list<T>::iterator& it){ std::cout << *it <
#include <list>
#include <iostream>
template<typename T>
void print_list_element(typename std::list<T>::iterator& it){
std::cout << *it << std::endl;
}
int main() {
std::list<int> theList;
theList.push_back(1);
std::list<int>::iterator it = theList.begin();
print_list_element(it);
return 0;
}
#包括
#包括
模板
无效打印列表元素(typename std::list::iterator&it){
std::coutg++无法确定它应该使用print\u list\u元素
的哪个模板重载。如果明确指定模板参数,则它可以工作:
print_list_element<int>(it);
打印列表元素(it);
这是非法的,因为STD::列表< t>:迭代器不是标准调用适当的推导上下文
其他响应是正确的,但是为了完整性,我只需补充一点,通过设计,C++只能在某些情况下自动推断模板参数,而这不是其中之一。
仔细想想,您会发现在这种情况下自动推断会导致不希望出现的情况。std::list::iterator
不是真正的类型,它只是真正类型的typedef
别名(例如,它可能是T*
)它被立即翻译成,因此编译器必须建立某种“反向索引”为了将T*
映射回std::list::iterator
,以便自动推断T
在这里工作。但是,一旦创建了另一个名为iterator
的类型成员,该成员被typedef
映射到T*
,那么编译器将有两个选项显然,当一个不相关的类添加一个特定的typedef
type成员时,任何自动扣减策略都会被破坏,因此无法工作。更好的方法是这样编写函数:
template<typename Iter>
void print_element(Iter it){
std::cout << *it << std::endl;
}
模板
无效打印元素(Iter it){
std::我认为03年标准的适当部分是:14.8.2.4/4。该标准还说这是一个“非推断上下文”,而不是你上面的措辞。+1。这甚至适用于普通数组。如果出于某种原因,你真的希望它只适用于std::列表,请查找Boost的enable_If模板。
template<typename Iter>
void print_element(Iter it){
std::cout << *it << std::endl;
}