在模板化构造函数中调用构造函数时的有趣行为

Wor*_*der 0 c++ templates compiler-errors c++11

我刚刚创建了一个非常小的项目,当我遇到一个我无法追踪的有趣的编译器错误时,我认为我可以立即做(这是关于基本代理).这是代码的简化版本:

class NoComp {
};

class Comp {
    bool operator==(const Comp& other)
    { std::cout << "Working!" << std::endl; return true;}
};

struct Test {
    template<typename T>
    Test(T&& obj) {}
    bool operator==(const Test& other);
};
int main()
{
    Test a(Comp());
    Test b(NoComp());
    a.operator ==(b);
}
Run Code Online (Sandbox Code Playgroud)

当编译这将产生以下编译器错误g++ version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC) 在这里找到:

main.cpp: In function 'int main()':                                    
main.cpp:22:13: error: request for member 'operator==' in 'a', which is
 of non-class type 'Test(Comp (*)())'                                  
  a.operator ==(b);                                                    
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚这个错误意味着什么以及它为何存在.那里发生了什么,它是一个bug还是标准所涵盖的?如果可以的话,我该如何避开?

Col*_*mbo 7

Test a(Comp());
Test b(NoComp());
Run Code Online (Sandbox Code Playgroud)

这声明了两个名为a和的函数b.第一个有一个类型的参数Comp(*)()和一个返回类型Test,第二个有一个NoComp(*)()并且还返回一个Test.Comp()是函数类型,并且作为函数类型的所有参数,调整为指向函数的类型.同样如此NoComp().

使用双括号:

Test a((Comp()));
Test b((NoComp()));
Run Code Online (Sandbox Code Playgroud)

或者从C++ 11开始的列表初始化.