当struct使用std :: less作为参数时,对象类型看起来很奇怪

时间:2014-04-27 10:21:46

标签: c++ visual-studio

Visual Studio 2013在以下代码中给出了错误。当我构造对象时,它报告a1不是类/结构/联合。我不确定这段代码究竟是什么问题。似乎a2没有报告错误,a1也不应该。

如果我将鼠标移到a1上,则表示其类型为" A a1(std :: less(*)())"和a2只显示" A a2"这就是我所期待的。

任何人都对这里发生的事情有任何想法?感谢。

#include <functional>

class A {
public:
    A(const std::less<int> &a) { }
    void foo() { }
};

int main(int argc, char *argv[]) {
    A a1(std::less<int>());
    A a2 = A(std::less<int>());

    a1.foo(); // Error: "left of '.foo' must have class/struct/union"
    a2.foo();

    return 0;
}

2 个答案:

答案 0 :(得分:1)

您是most vexing parse

的受害者 <{1>}中的

,声明

A a1(std::less<int>());作为一个函数,它将a1作为参数并返回std::less<int>类型的对象


强制编译器将此视为A的变量定义,使用:

a1

答案 1 :(得分:0)

本声明

A a1(std::less<int>());

是一个函数声明,其返回类型为A,参数类型为std::less<int>().而是写入

A a1 { std::less<int>() };

A a1( ( std::less<int>() ) );