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<short>
那样为它指定模板参数。并且没有办法为构造函数模板指定模板参数;模板参数只能从构造函数参数推导出来。
所以你可以
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。尽管如此,我还是无法通过以上是关于struct 中不可访问的模板化构造函数的主要内容,如果未能解决你的问题,请参考以下文章
类中移动构造函数的位置/顺序很重要?与移动构造函数结合使用的模板化强制转换运算符
九结构和类(结构的概念,类的概念,声明,构造函数,对象的实例化,类和对象的关系,实例的和静态的)