以下代码最好地说明了我的问题:
#include <fstream>
#include <iterator>
class Bar
{
public: template <class Iterator> Bar(Iterator first, Iterator last) {}
};
void foo(const Bar& bar) { }
int main(int argc, char** argv)
{
std::ifstream file("file.txt");
Bar bar(std::istream_iterator<char>(file), std::istream_iterator<char>());
foo(bar); // error C2664: 'foo' : cannot convert parameter 1 from 'Bar (__cdecl *)(std::istream_iterator<_Ty>,std::istream_iterator<_Ty> (__cdecl *)(void))' to 'const Bar &'
// with
// [
// _Ty=char
// ]
// Reason: cannot convert from 'overloaded-function' to 'const Bar'
// No constructor could take the source type, or constructor overload resolution was ambiguous
return 0;
};
下面是一些类似的实例bar
不会引起同样的歧义:
Bar bar = Bar(std::istream_iterator<char>(file), std::istream_iterator<char>());
and
std::istream_iterator<char> start(file);
std::istream_iterator<char> end;
Bar bar(start, end);
我的问题是,第一个声明是什么?bar
这会导致它被误解吗?
注意:我正在使用 Visual Studio 2010 (10.0.30319.1) 进行测试
ArunMu 获得部分功劳,这确实是一个例子最令人烦恼的解析,但该术语是在 Meyer 的《Effective STL》(第 1 章第 6 项)中创造的,而不是在 Exceptional C++ 中创造的。
It is被解释为函数指针((__cdecl *)
错误的一部分是完全泄露的),显然 C++ 标准要求它以这种方式解释。有人有这方面的章节/诗句引用吗?
还有另一种解决方案可以提供消歧作用。在每个参数周围添加一组附加括号也有效:
Bar bar( (std::istream_iterator<char>(file)), (std::istream_iterator<char>()) );
还值得指出的是,正如我最初所想的那样,该问题与模板无关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)