Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 除非另有规定,否则如何强制模板类使用指定的类型?_C++_Class_Templates_Template Specialization - Fatal编程技术网

C++ 除非另有规定,否则如何强制模板类使用指定的类型?

C++ 除非另有规定,否则如何强制模板类使用指定的类型?,c++,class,templates,template-specialization,C++,Class,Templates,Template Specialization,我的模板类有问题。我指定了模板类的默认类型,如下所示: 模板 苹果类{ 公众: tx; 苹果(tx):x(x){} } 但是,当我创建这样的对象时: 苹果obj(2); 除非我这样做,否则类型将变为int: apple<float> obj(2); 苹果obj(2); 我如何让它保持浮动 对默认模板参数使用专门化,如 apple<> obj( 2 ); 苹果obj(2); 添加此扣减指南以强制所有参数扣减解析为默认参数: template <class T

我的模板类有问题。我指定了模板类的默认类型,如下所示:

模板
苹果类{
公众:
tx;
苹果(tx):x(x){}
}
但是,当我创建这样的对象时:

苹果obj(2); 除非我这样做,否则类型将变为int:

apple<float> obj(2);
苹果obj(2);
我如何让它保持浮动

对默认模板参数使用专门化,如

apple<> obj( 2 );
苹果obj(2);
添加此扣减指南以强制所有参数扣减解析为默认参数:

template <class T>
apple(T) -> apple<>;
模板
苹果(T)->苹果;

另一种可能的解决方案是修改构造函数:

apple(std::enable_if_t<1, T> x): x(x) {}
apple(std::enable_if_t x):x(x){

这样,编译器将无法从传递给
x
的参数推断
t
,而将使用
t
(您提供的)的默认类型。

看起来您使用的是c++17。由于c++17
T
可以从初始值设定项中推导,因此在您的例子中,它是
2
-
int
。是的,我使用的是c++17,它使用您传递的文本值的类型
apple obj(2.0f)
用于浮点数,
apple obj(2.0)
用于Double使用扣除指南禁用CTAD。这有点深magic@StoryTeller什么是CTAD?@StoryTeller所有那些抱怨脚踏枪的人都忽略了一个事实,那就是你应该把它向后推。@Vladfrommosco类模板参数演绎。很快。