請在將此標記為此問題的副本之前閱讀整個帖子
這段代碼編譯失敗,模板推演錯誤:
#include <iostream>
#include <type_traits>
template<typename T = float, int N>
class MyClass
{
public:
template<typename DATA_TYPE>
using MyType = std::conditional_t<(N>0), DATA_TYPE, double>;
MyType<T> Var;
void Foo()
{
Bar(Var);
}
template<typename TYPE>
void Bar(MyType<TYPE> Input)
{
std::cout << typeid(Input).name() << std::endl;
}
};
int main()
{
MyClass<float, 1> c;
c.Foo();
return 0;
}
我理解我在上面鏈接的問題中提出的觀點,即“允許選擇要推斷的型別的條件取決于型別本身”,但是,為什么在我提供的特定情況下編譯器會失敗這里的條件似乎完全獨立于型別,還是我缺少什么?
如果有人可以參考 c 標準的一部分,讓我完全理解這種行為,我會非常高興。
uj5u.com熱心網友回復:
作為鏈接的問題,TYPE是不可演繹的。MyType<TYPE>實際上是XXX<TYPE>::type。
您有幾種選擇,從您的代碼中,我會說其中之一
Bar不再模板:template<typename T = float, int N> class MyClass { public: template<typename DATA_TYPE> using MyType = std::conditional_t<(N>0), DATA_TYPE, double>; MyType<T> Var; void Foo() { Bar(Var); } void Bar(MyType<T> Input) { std::cout << typeid(Input).name() << std::endl; } };requires(或 C 20 之前的 SFINAE/專業化):template<typename T = float, int N> class MyClass { public: template<typename DATA_TYPE> using MyType = std::conditional_t<(N>0), DATA_TYPE, double>; MyType<T> Var; void Foo() { Bar(Var); } template<typename TYPE> void Bar(TYPE Input) requires(N > 0) { std::cout << typeid(Input).name() << std::endl; } void Bar(double Input) requires(N <= 0) { std::cout << typeid(Input).name() << std::endl; } };
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478095.html
