Kyl*_*yle 3 c++ templates constructor iostream c++17
模板化构造函数在 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;
}
Run Code Online (Sandbox Code Playgroud)
- 编辑 -
添加我最初遇到的第一个问题。答案很快就出来了,但这里还有一些细微差别。让我更好地描述它。
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>();
}
Run Code Online (Sandbox Code Playgroud)
我最初声明它必须有默认构造函数,但我实际上并不需要这样。然而,我没有在任何参数中直接引用模板参数,我知道为什么这一定是我所坚持的?
-- 编辑 3 --
在我的例子中,我只需要一个类模式模板设置。我有点固执的原因是需要在标头中保留一些代码。
如果您显式地从简短构造 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;
}
Run Code Online (Sandbox Code Playgroud)