C++ C++;通过多个函数传递模板参数
考虑这些代码行。当我尝试编译时,编译器将显示错误,如“a”不是“DataType1”的成员。我理解编译器是如何将这些视为错误的,但是有没有什么方法可以避免这种方法或其他有效的方法C++ C++;通过多个函数传递模板参数,c++,templates,C++,Templates,考虑这些代码行。当我尝试编译时,编译器将显示错误,如“a”不是“DataType1”的成员。我理解编译器是如何将这些视为错误的,但是有没有什么方法可以避免这种方法或其他有效的方法 struct DataType1 { public: int x; }; struct DataType2 { public: int a; }; template <class E> bool job2(E* newData, const int i){ int something = 2;
struct DataType1 { public: int x; };
struct DataType2 { public: int a; };
template <class E>
bool job2(E* newData, const int i){
int something = 2;
if (i == 1) newData->x = something;
if (i == 2) newData->a = something;
}
template <class E>
bool job1(List<E>* dataBase){
E* newData = new E;
job2(newData, 1);
dataBase->push_back(newData);
}
template <class E>
int main(){
List<DataType1>* dataBase = new List<DataType>;
job1(dataBase);
}
structdatatype1{public:intx;};
结构数据类型2{public:inta;};
模板
bool job2(E*newData,const int i){
int某物=2;
如果(i==1)newData->x=something;
如果(i==2)newData->a=something;
}
模板
bool作业1(列表*数据库){
E*newData=newe;
job2(newData,1);
数据库->推回(新数据);
}
模板
int main(){
列表*数据库=新列表;
job1(数据库);
}
如果您手头有C++17,您可以编写:
template <class E>
bool job2(E* newData){
int something = 2;
if constexpr (std::is_same_v<E, DataType1>)
newData->x = something;
else
newData->a = something;
}
其中
commonOperation
是所有函数的共同点。如果您手头有C++17,您可以编写:
template <class E>
bool job2(E* newData){
int something = 2;
if constexpr (std::is_same_v<E, DataType1>)
newData->x = something;
else
newData->a = something;
}
其中,
commonOperation
是所有函数的共同点。您可以将const int i
变量转换为模板参数,并专门化模板化函数。但这带来了一个问题:为什么不删除i
参数,只专注于E
?另一种方法是在每个DataType
结构中定义一个具有相同名称(SetI()
)的set函数,并调用它来代替newData->SetI(something)
。如果可以使用C++17,如果您可以将i
作为模板参数传递,您可以使用if constepr
@freakish我尝试用job2(DataType1*newData)重载,但它无法编译,出现错误无法将参数从E*转换为DataType1
@HáHuyLongHả我认为这是因为您试图将类型为E*
的元素推回列表。这显然是错误的,即使E=DataType1
。问题在于job1
功能,而不是job2
专门化/过载。更不用说job1
会泄漏内存。您可以将const int i
变量转换为模板参数并专门化模板化函数。但这带来了一个问题:为什么不删除i
参数,只专注于E
?另一种方法是在每个DataType
结构中定义一个具有相同名称(SetI()
)的set函数,并调用它来代替newData->SetI(something)
。如果可以使用C++17,如果您可以将i
作为模板参数传递,您可以使用if constepr
@freakish我尝试用job2(DataType1*newData)重载,但它无法编译,出现错误无法将参数从E*转换为DataType1
@HáHuyLongHả我认为这是因为您试图将类型为E*
的元素推回列表。这显然是错误的,即使E=DataType1
。问题在于job1
功能,而不是job2
专门化/过载。更不用说job1
泄漏内存。我尝试了第二个,但它无法编译,出现错误无法将参数从E*转换为数据类型1
我尝试了第二个,但它无法编译,出现错误无法将参数从E*转换为数据类型1