【问题标题】:Templated constructor not accessible in structstruct 中不可访问的模板化构造函数
【发布时间】:2021-12-23 08:39:37
【问题描述】:

在 struct 中无法访问模板化构造函数。如果可能的话,我仍然想允许非模板化的构造。如果不可能,我想了解这在语言中实际上是什么墙,如果有的话..

错误是这样的: 函数样式转换或类型构造的预期为 '('

这是一个语法错误。使用模板构建的方式是 name(args),这正是:

A a = A<short>(1); ... 正在做,对吧?

#include <iostream>

struct A {
    int i;
    A() : i(0) { }
    
    template <typename T>
    A(T i) : i(int(i)) { }

    void print() {
         std::cout << i << std::endl;
    }
};

int main() {
    A a = A<short>(1);
    a.print();
    return 0;
}

-- 编辑--

添加我一开始遇到的#1 问题。答案来得很快,但这里有更多的细微差别。让我更好地描述一下。

struct A {
    std::function<int(int)> fn;

    template <typename T>
    A() {
        fn = [](int i) {
            /// merely using T somewhere in this lambda
            return int(T(i));
        };
    }
};

int main(int c, const char *v[]) {
    A a = A<int>();
}

我最初声明它必须具有默认构造函数,但我实际上并不需要它。但是,我没有在任何参数中直接引用模板参数,我知道为什么这一定是我坚持的?

-- 编辑 3--

就我而言,我只需要一个类模式模板设置。我有点固执的原因是需要在标题中保留一些代码。

【问题讨论】:

  • 这能回答你的问题吗? C++ template constructor
  • 您必须添加一些参数才能进行类型推导;或从头开始制作A 模板。

标签: c++ templates constructor c++17 iostream


【解决方案1】:

如果你显式地从一个短的构造函数 A 将被选择模板化构造函数

#include <iostream>

struct A 
{
    int i;
    A() : i(0) { }

    // i(int(i)) { } <== do NOT use "C" style casts in C++
    template <typename T>
    A(T v) :
        i{ static_cast<int>(v) } 
    {
        std::cout << "using templated constructor\n";
    }


    void print() {
        std::cout << i << std::endl;
    }
};

int main() 
{
    A a{ short{1} }; // construct a from a short
    a.print();
    return 0;
}

【讨论】:

    【解决方案2】:

    A 是一个非模板类,所以你不能像A&lt;short&gt; 那样为它指定模板参数。并且没有办法为构造函数模板指定模板参数;模板参数只能从构造函数参数推导出来。

    所以你可以

    A a = A(1); // T will be deduced as int
                // if pass a short like static_cast<short>(1) T will be deduced as short
    

    或者只是

    A a(1); // T will be deduced as int
            // if pass a short like static_cast<short>(1) T will be deduced as short
    

    【讨论】:

    • 看起来我可能需要编辑这个。我在我的用例中做的比我描述的要多。
    • 否,但通过显式构造一个短的模板构造函数将被选中
    • 好吧,我的问题是我正在尝试使用应用程序类构造函数来执行此操作,并将 View 类型作为模板参数给出。在这种情况下,它是按要求传递的,并在使用时创建了一个 lambda。尽管如此,我还是无法通过
    • @Kalen 是否需要任何隐式转换?从 lambda 到 类型。在模板参数推导中不会考虑隐式转换,因此您必须在传递给构造函数之前显式执行转换。
    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多