struct 中不可访问的模板化构造函数

Posted

技术标签:

【中文标题】struct 中不可访问的模板化构造函数【英文标题】:Templated constructor not accessible in struct 【发布时间】: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 模板。 【参考方案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 short1 ; // 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 到 类型。在模板参数推导中不会考虑隐式转换,因此您必须在传递给构造函数之前显式执行转换。

以上是关于struct 中不可访问的模板化构造函数的主要内容,如果未能解决你的问题,请参考以下文章

类中移动构造函数的位置/顺序很重要?与移动构造函数结合使用的模板化强制转换运算符

MSVC:隐式模板实例化,但未使用模板构造函数

九结构和类(结构的概念,类的概念,声明,构造函数,对象的实例化,类和对象的关系,实例的和静态的)

C++类和对象

C++:如何在结构中定义类实例。类具有参数化构造函数[重复]

构造函数可以实例化对象