gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:05:41 25 4
gpt4 key购买 nike

在 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--

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

最佳答案

如果你显式地从一个短的构造函数 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;
}

关于c++ - struct 中不可访问的模板化构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70459567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com