C2516从Visual Studio 2013中的Lambda继承时发生错误

布马特
#include <iostream>
#include <thread>
#include <utility>

using namespace std;

template <typename T>
class OnExitImpl : private T
{
public:
    template <typename Y>
    OnExitImpl(Y&& todo) : T(std::forward<Y>(todo)), _doIt(true) {}

    OnExitImpl(OnExitImpl&& other) : T(std::move(static_cast<T&>(other))), _doIt(other._doIt)
    {
        other._doIt = false;
    }

    ~OnExitImpl()
    {
        if (_doIt)
        {
            (*this)();
        }
    }

    void Cancel()
    {
        _doIt = false;
    }

    OnExitImpl& operator=(OnExitImpl&& other)
    {
        this->T::operator=(std::move(static_cast<T&>(other)));
        _doIt = other._doIt;
        other._doIt = false;
    }

private:
    bool _doIt;
};

template <typename T>
OnExitImpl<T> OnExit(T action)
{
    return OnExitImpl<T>(std::move(action));
}

int FetchMultithreaded(int stmt)
{
    auto onExit = OnExit([&](){ cout << stmt << endl; });

    std::thread fetchThread([&]()
    {
        auto onExit = OnExit([&](){ cout << stmt << endl; });
    });

    return 0;
}

int main()
{
    return FetchMultithreaded(0);
}

在Visual Studio 2013中进行编译时,出现以下错误:

1>Source.cpp(9): error C2516: 'T' : is not a legal base class
1>          Source.cpp(55) : see declaration of 'T'
1>          Source.cpp(55) : see reference to class template instantiation 'OnExitImpl<void (__cdecl *)(void)>' being compiled

当我在http://ideone.com/O6I9nj上尝试使用它时,我仅收到有关std :: forward的大量错误,不确定那里发生了什么。虽然不确定正在使用哪个编译器。

Visual Studio错误消息让我认为这是一个编译器错误,因为它似乎将lambda视为函数指针...

编辑:将模板参数添加到std :: forward之后,它现在可以在Ideone上编译(但由于其他原因无法链接),但对于Visual Studio则不做任何更改。这使我怀疑这是一个编译器错误。

编辑2:无论如何,我通过添加以下代码来解决此问题:

template <typename Ret>
struct FnPtrWrapper
{
    FnPtrWrapper(Ret (*fn)(void)) : _fn(fn)
    {
        assert(fn);
    }

    Ret operator()() const
    {
        return (*_fn)();
    }

private:
    Ret (*_fn)(void);
};

template <typename Ret>
OnExitImpl<FnPtrWrapper<Ret>> OnExit(Ret(*fn)(void))
{
    return OnExitImpl<FnPtrWrapper<Ret>>(fn);
}

修复它似乎很奇怪,因为我使用的lambda触发了错误,实际上捕获了函数参数,因此不应转换为函数指针...

哥伦布

我相信这是一个VC ++错误,以前(在SO上)遇到过。最小的复制样本:

#include <type_traits>

template <typename T>
struct B { static_assert(std::is_class<T>::value, "T not a class"); }; // (2)

int main()
{
    []{
        auto a = []{};
        static_assert( std::is_class<decltype(a)>::value, "Not a class" ); // (1)
        B<decltype(a)> b;
    }();
}

关于rextester的VC ++的演示

请注意,代码必须位于外部lambda内部才能发生错误。
当(1)成功时,b导致(2)失败的声明

source_file.cpp(4):错误C2338:T不是类
source_file.cpp(11):请参见对B<void (__cdecl *)(void)>正在编译的类模板' '的引用

这表示模板参数decltype(a)表示函数的指针类型,同时也表示类的类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Visual Studio 2015中安装Postsharp时发生错误-532462766

来自分类Dev

在Visual Studio中创建SharePoint WebPart时发生错误-“生成项目时发生错误”

来自分类Dev

生成时Visual Studio 2013输出中的Project dll错误

来自分类Dev

如何在TFS中创建分支时停止Visual Studio 2013继承团队项目安全设置

来自分类Dev

从WebClient继承时,Visual Studio类图标发生更改

来自分类Dev

从WebClient继承时,Visual Studio类图标发生更改

来自分类Dev

即使在Visual Studio 2010中访问变量时也会发生C2326错误

来自分类Dev

在Visual Studio 2013中编译sqlite.c时收到错误C4996

来自分类Dev

在Visual Studio 2013中编译sqlite.c时收到错误C4996

来自分类Dev

Visual Studio 2013中的C ++ lambda:捕获此指针

来自分类Dev

使用Visual Studio 2013时.c文件中的语法错误

来自分类Dev

Visual Studio 2013中的FTP发布错误

来自分类Dev

Visual Studio中的C ++错误

来自分类Dev

C ++ Visual Studio 2013编译错误?

来自分类Dev

Visual Studio 2013中的设计视图发生了什么?

来自分类Dev

在Visual Studio中安装NUGET软件包时发生错误

来自分类Dev

在Visual Studio 10中使用类型转换运算符重载时发生C2440错误

来自分类Dev

Visual Studio 2013中的C ++ 11 Chrono

来自分类Dev

在Visual Studio C ++ 2013中设置图形

来自分类Dev

Visual Studio 2013中的调试技术c ++

来自分类Dev

C ++中的数字溢出(Visual Studio 2013)

来自分类Dev

VIsual Studio 2013中C上的GUI

来自分类Dev

尝试在Visual Studio 2013中引用静态库项目时出现链接器错误

来自分类Dev

Visual Studio 2013 C ++-准则

来自分类Dev

Visual Studio 2013登录错误

来自分类Dev

奇怪的Visual Studio 2013错误

来自分类Dev

Cmake Visual Studio 2013错误

来自分类Dev

Visual Studio 2013登录错误

来自分类Dev

Visual Studio 2013中出现奇怪的“错误/用户错误”

Related 相关文章

  1. 1

    在Visual Studio 2015中安装Postsharp时发生错误-532462766

  2. 2

    在Visual Studio中创建SharePoint WebPart时发生错误-“生成项目时发生错误”

  3. 3

    生成时Visual Studio 2013输出中的Project dll错误

  4. 4

    如何在TFS中创建分支时停止Visual Studio 2013继承团队项目安全设置

  5. 5

    从WebClient继承时,Visual Studio类图标发生更改

  6. 6

    从WebClient继承时,Visual Studio类图标发生更改

  7. 7

    即使在Visual Studio 2010中访问变量时也会发生C2326错误

  8. 8

    在Visual Studio 2013中编译sqlite.c时收到错误C4996

  9. 9

    在Visual Studio 2013中编译sqlite.c时收到错误C4996

  10. 10

    Visual Studio 2013中的C ++ lambda:捕获此指针

  11. 11

    使用Visual Studio 2013时.c文件中的语法错误

  12. 12

    Visual Studio 2013中的FTP发布错误

  13. 13

    Visual Studio中的C ++错误

  14. 14

    C ++ Visual Studio 2013编译错误?

  15. 15

    Visual Studio 2013中的设计视图发生了什么?

  16. 16

    在Visual Studio中安装NUGET软件包时发生错误

  17. 17

    在Visual Studio 10中使用类型转换运算符重载时发生C2440错误

  18. 18

    Visual Studio 2013中的C ++ 11 Chrono

  19. 19

    在Visual Studio C ++ 2013中设置图形

  20. 20

    Visual Studio 2013中的调试技术c ++

  21. 21

    C ++中的数字溢出(Visual Studio 2013)

  22. 22

    VIsual Studio 2013中C上的GUI

  23. 23

    尝试在Visual Studio 2013中引用静态库项目时出现链接器错误

  24. 24

    Visual Studio 2013 C ++-准则

  25. 25

    Visual Studio 2013登录错误

  26. 26

    奇怪的Visual Studio 2013错误

  27. 27

    Cmake Visual Studio 2013错误

  28. 28

    Visual Studio 2013登录错误

  29. 29

    Visual Studio 2013中出现奇怪的“错误/用户错误”

热门标签

归档