我遇到以下代码在GCC(4.8+测试)和Clang(3.4+测试)编译但未在Visual Studio 2015(VC++ 14.0)上编译的问题。是否有效返回声明的枚举类? (Visual Studio 2015链接器错误)
foo.h中:
#include <functional>
namespace Error {
enum class Code;
static const Code None = static_cast<Code>(0);
}
class Foo{
public:
std::function<Error::Code()> Run();
};
Foo.cpp中
#include "Foo.h"
#include <iostream>
std::function<Error::Code()> Foo::Run() {
return [&]() {
std::cout << "hello\n";
return Error::None;
};
}
main.cpp中:
#include "Foo.h"
namespace Error {
enum class Code {
None = 0,
Error = 1,
};
}
int main() {
Foo foo;
foo.Run()();
}
在VC 14.0将得到的误差如下:
Foo.obj : error LNK2001: unresolved external symbol "enum Error::Code __cdecl std::_Invoke_ret<enum Error::Code,class <lambda_813e82254384ef384f6a5fe34e885f01> &>(struct std::_Forced<enum Error::Code,0>,class <lambda_813e82254384ef384f6a5fe34e885f01> &)" ([email protected]@[email protected]@AAV<lambda_813e82254384ef384f6a5fe34e885f01>@@@[email protected]@[email protected]@@[email protected]@[email protected]@[email protected]@[email protected]<lambda_813e82254384ef384f6a5fe34e885f01>@@@Z)
我认为这是一个内部std库函数,用于实现std::function
。
此代码类似于内部库的用法我试图使用它共享工具的标准程序接口,但前进声明错误代码,以便可以自定义它们。我相信这应该是基于§7.2的有效代码(参见this answer)虽然前面声明的枚举应该是一个完整类型,并且可用作返回值。以下是标准中的相关位:
An opaque-enum-declaration is either a redeclaration of an enumeration in the current scope or a declaration of a new enumeration. [Note: An enumeration declared by an opaque-enum-declaration has fixed underlying type and is a complete type. The list of enumerators can be provided in a later redeclaration with an enum-specifier. —end note ]
此代码是否有效?如果是这样,是否有解决方法让VC++接受它?
_“枚举虽然是前向声明的,应该是一个完整的类型并且可用作返回值。”_前向声明不提供_complete types_ enum或不。 –
@πάνταῥεῖ这就是为什么这在技术上不是一个前向声明,而是一个不透明枚举声明(如果甚至对“前向声明”这个术语甚至有一个恰当的定义......)无论如何,这样的声明引入了* a完全枚举类型*。枚举有一个特殊的情况,IIRC永远不会引入不完全的枚举类型。 – dyp
你的'enum class Code' _definition_与你的_declared_'enum类不在同一个命名空间中Error :: Code' – inetknght