我正在尝试编写一个特征来检测任意类型是否为其定义了插入运算符。要做到这一点,我希望使用std :: is_same<>将函数指针的类型与预期类型进行比较。我有以下代码展示的问题
#include <iostream>
class A {};
std::ostream& operator<<(std::ostream& os, const A& a)
{
return os;
}
int main()
{
decltype(static_cast<std::ostream&(*)(ostream&, const A&)>(&operator<< )) foo = nullptr;
std::cout << foo << std::endl;
return 0;
}
在gcc 4.8中使用--std = c ++ 11
test2.cpp:12:81: error: expected primary-expression before ')' token
decltype(static_cast<std::ostream&(*)(std::ostream&, const A&)>(&::operator<< )) foo = nullptr;
^
错误没有出现在clang或更新版本的gcc中,但是对于生产我们必须能够在gcc 4.8中编译。在GCC 4.8中有解决方法吗?
答案 0 :(得分:3)
看起来那个版本的GCC没有正确解析这个问题。要解决此问题,可以声明函数指针类型的别名:
using op_type = std::ostream&(*)(std::ostream&, const A&);
decltype(static_cast<op_type>(&operator<< )) foo = nullptr;
答案 1 :(得分:0)
而不是ostream&
,请写std::ostream&
:
#include <iostream>
class A {};
std::ostream& operator<<(std::ostream& os, const A& a)
{
return os;
}
int main()
{
decltype(static_cast<std::ostream&(*)(std::ostream&, const A&)>(&operator<< )) foo = nullptr;
std::cout << foo << std::endl;
return 0;
}