【发布时间】: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