![]() |
1
6
请注意
第一个函数与第二个函数采用不同的参数类型,因此这两个函数类型不兼容。不能从三元中同时返回指向这两种类型的指针,因为三元中的两种类型必须兼容。 然而,您正在将其过度复杂化。只需编写一个重载函数:
这也简化了使用,因为您只需编写
|
![]() |
2
3
正如Klaus(和Justin,以及R Sahu)所解释的,您的三元运算符接收到两个不兼容的对象。
但是,如果使用模板专门化,则不需要
但更好的解决方案(IMHO)是Justin(和Klaus,第(2)点)提出的:两个同名函数;参数选择正确的参数。 |
![]() |
3
3
我相信你有很多错误的假设! 1) 条件/三元运算符不能有两种不同的返回类型。因此,两个表达式必须是相同的类型,或者必须能够隐式转换到第一个表达式! 2) 如果表达式的类型在编译时是明确的,则不需要手动选择要调用的函数。这是从编译器中完成的!一个简单的重载非常适合这种情况。根本不需要模板,也不需要SFINAE或constexpr if。 3) 如果您有用户输入,则无法确定constexpr/std::是否相同,因为所有模板参数都必须在编译时已知。您不能将运行时数据放入模板参数! 因此,必须有一个完全不同的解决方案为您的问题! |
![]() |
4
1
该问题是由定义时的条件表达式引起的
条件表达式的第二项和第三项不能完全无关。 E、 g。
将导致与nether相同的编译器错误
在您的案例中,引起问题的两种类型是
您可以使用另一个元函数来帮助实现您的意图。
和使用
|
![]() |
5
0
我不相信您需要这么荒谬的东西,可能只需要重载一个函数即可:
如果你坚持TMP 问题是对于三元数,最后两个操作数必须可转换为同一类型。要获得更简单的示例,请考虑 this :
虽然在编译时可以清楚地看到这就像
有不同的方法可以解决这个问题,对于C++11,您可以使用 tag dispatching 要在编译时选择重载,请执行以下操作:
对于C++17,可以使用
|
![]() |
TCD · 标准库非类型模板类是否显式实例化? 2 年前 |
![]() |
sovesti · 参数较少的模板函数中的演绎 2 年前 |
![]() |
KiraHoneybee · 具有构造函数参数的模板化类 2 年前 |
![]() |
Seymore Glass · 模板不工作的默认参数 2 年前 |
![]() |
Alexander Daum · 模板参数中对模板类型的引用 6 年前 |
![]() |
ledonter · 为什么注入的类名有时不被视为类模板中的模板名? 6 年前 |