如何解决这个问题?
enum SID {SID_A, SID_B};
template<SID sid>
class Emp
{
public:
template<typename T> struct s{T a;};
Emp<sid>(){
if constexpr(sid == SID_A){
s<T>(){a = 0;} //error: use of undeclared identifier 'T'
}
if constexpr(sid == SID_B){
s<T>(){a = 1;} //error: use of undeclared identifier 'T'
}
}
};
编译器:clang 9.0
编辑-----
我希望根据s.a
的参数来实现结构成员sid
的默认初始化。
T
通常是int
或float
。
例如:
Emp<SID_A> emp_a; //here s.a = 0
Emp<SID_B> emp_b; //here s.a = 1
答案 0 :(得分:1)
如果我对您的理解正确,那么您希望Emp
有一个数据成员s
,它是一个包含数字数据成员a
的结构。如果这是一个Emp<SID_A>
,则该成员应该是一个初始值为0的int,而对于Emp<SID_B>
来说,它应该是一个值为1.0的浮点型。我猜想您想自由地将SID
类型的其他值与this->s.a
的不同数字类型和值相关联。
您可以使用模板专门化来实现。在类s
之前声明S
的类型作为结构Emp
:
#include <type_traits>
enum SID {SID_A, SID_B};
template <SID> struct S;
template <> struct S<SID_A> { typedef int Number; Number a;};
template <> struct S<SID_B> { typedef float Number; Number a;};
// You can define further specializations here
template<SID sid>
class Emp
{
public:
S<sid> s;
Emp()
{
switch(sid)
{
case SID_A : s.a = 0.1; break; // Note value is 0.1 to prove it's an int
case SID_B : s.a = 1.1; break; // Note value is 1.1 to prove it's a float
// define further cases here
default: ;
}
}
};
现在:
#include <iostream>
int main()
{
Emp<SID_A> A;
Emp<SID_B> B;
std::cout << A.s.a << std::endl;
std::cout << B.s.a << std::endl;
return 0;
}
输出:
0
1.1