Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中将typename用作函数参数时,如何传递引用+;?_C++_Templates - Fatal编程技术网

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