我正在尝试使用GCC 4.8.5(CentOS 7的默认值)在C ++ 11中与头文件分开定义一个简单的显式转换:
foo.h:
#ifndef foo_h_
#define foo_h_
typedef struct {
int x;
explicit operator int() const;
} A;
#endif
foo.cpp:
#include "foo.h"
A::operator int() const
{
return this->x;
}
main.cpp:
#include "foo.h"
int main(int,char**)
{
A a{1};
int b = (int)a - 1;
return 0;
}
GCC 4.8.5莫名其妙地无法链接此代码:
$ g++ -std=c++11 foo.cpp main.cpp
/tmp/cc5osctA.o: In function `main':
main.cpp:(.text+0x1e): undefined reference to `A::operator int() const'
collect2: error: ld returned 1 exit status
但是,如果我使用GCC> = 5的任何版本(例如RHEL的devtoolset-4软件集合中的GCC 5.3.1),它就会正常工作,正如我期望的那样:
$ scl enable devtoolset-4 "g++ -std=c++11 foo.cpp main.cpp"
### (no linker errors, b == 0 when running)
这是GCC 4.8.5的C ++ 11支持中的错误吗?还是我的代码格式错误?