为什么Visual Studio无法在模板类中选择正确的构造函数?

纳扎尔·迪德科夫斯基(Nazar Didkovskyi)

当我实例化模板类时,Visual Studio没有看到正确的构造函数。我在哪里弄错了?

我已经尝试过使复制/移动构造函数显式/删除。无济于事。

#include <set>

using namespace std;

template <class T, template<class> class ConnectionType>
struct node
{
    T value;
    node(const T& value) : value(value) {}

    set<ConnectionType<T>> connections;
};

template <class T>
struct connection
{
    node<T, connection>* n;

    connection(node<T, connection>* n) :
        n(n) {}

    bool operator<(const connection& b) const
    {
        return n < b.n;
    }
};

int main()
{
    node<int, connection> a(0);
    connection<int> c(&a); // ERROR HERE

    return 0;
}

错误:

error C2664:  'connection<T>::connection(connection<T> &&)': cannot convert argument 1 from 'node<int, connection> *' to 'node<T, connection<T>> *'
Aschepler

在类模板的范围内,模板的名称实际上是“注入的类名称”,它的作用类似于类成员,并且可以用作模板名称或类型名称,表示使用中的专业化。[本地温度] / 1

因此,当将此名称用作模板参数时,它可能表示含义,因此编译器需要检查相应的模板参数是类型还是模板。g ++和clang ++照原样接受您的代码。但是MSVC有一个错误,即使通常唯一相关的模板参数是模板模板参数,它也经常(但并非总是)假定用作模板参数的注入的类名称是类类型。(原始代码上的三个编译器:https : //godbolt.org/z/xrJSPB

要解决此问题,您可以使用限定名称,例如::connection当您从模板本身的作用域中指代模板的名称时。

template <class T>
struct connection
{
    node<T, ::connection>* n;

    connection(node<T, ::connection>* n) :
        n(n) {}

    bool operator<(const connection& b) const
    {
        return n < b.n;
    }
};

(所有三个编译器都接受这一点:https : //godbolt.org/z/st7liP

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Visual Studio无法显示正确的自动完成建议

为什么Visual Studio无法提取我的类库?

为什么Visual Studio无法识别is_open()函数

为什么需要Visual Studio安装nuget?

为什么Visual Studio不了解“线程”?

为什么模板函数的模板在Visual C ++中无效

为什么Unity在解析类时无法选择String构造函数?

为什么在C ++中,Visual Studio将我的类构造函数描述为具有“ 2+重载”?

为什么构造函数无法推断出模板参数?

为什么我的 Visual Studio 项目模板的描述不显示?

为什么Visual Studio 2012不能正确缩进

为什么我的代码无法在Visual Studio Code中运行?

为什么在Visual Studio 2015中无法编辑并继续工作?

为什么Visual Studio代码无法运行我的代码?

为什么我无法在 Linux 上打开 Visual Studio Code?

如何在Visual Studio 2019中选择Visual C#类模板?

为什么Visual Studio允许我在模板函数(C ++)中使用私有成员?

为什么以下模板化的类成员函数无法编译?

为什么带有Python扩展名的Visual Studio Code无法正确导入“分数”库?

设置OpenGL:为什么会出现这些错误?为什么Visual Studio冻结?

为什么“无法从类型变量中选择”

为什么Visual Studio会自动更改表单的布局?

为什么在Visual Studio 2017中Python损坏了?

为什么C4996上的Visual Studio 2013错误?

为什么此代码会使Visual Studio 2015崩溃?

为什么Visual Studio 2019不编译我的代码?

为什么在链接包含文件时Visual Studio错误?

为什么允许此代码在Visual Studio 2013下编译?

为什么Visual Studio试图链接“ freeglutd.lib”?