【发布时间】:2016-08-18 22:10:20
【问题描述】:
我在 C++ 标头中创建了一个具有以下签名的方法:
template<class _Ty>
class x {
public:
// ...
template<class func_Ty>
x *where(func_Ty &);
}
我的代码期望func_Ty 是可调用的(即函数指针、lambda 或重载operator() 的类),采用_Ty 或_Ty & 类型的单个参数,并返回bool 或@ 987654328@。我用这段代码调用函数(s 是x<int> *):
s->where([](int i){ return i % 2 == 0;});
这在 MSVC 上编译得很好,但 GCC 给了我一个错误:
no matching function for call to ‘x<int>::where(main()::__lambda0)’
如果我在 lambda 前面添加 *,GCC 编译正常,但 MSVC 给我一个错误:
error C2100: illegal indirection
这是其中一个编译器的错误吗?或者这两种解决方案都不是标准的?无论哪种方式,有没有办法让相同的代码在两个编译器上工作?
【问题讨论】:
-
为什么不使用
std::remove_if? -
与您的问题完全无关,但您不应使用前导下划线后跟大写字母来命名任何符号,例如 are reserved for the "implementation" (编译器和标准库)。
-
以下划线开头后跟大写字母 (
_Ty) 和包含两个连续下划线的名称保留给实现。不要使用它们。 -
@erip 我现在看到它可以代替我的
where函数工作,但是这并不能解决 lambda 语法问题,它可以转移到其他场景。 -
@JoachimPileborg 谢谢,我不知道
标签: c++ c++11 gcc visual-c++ lambda