Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++;通过多个函数传递模板参数_C++_Templates - Fatal编程技术网

C++ C++;通过多个函数传递模板参数

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;

考虑这些代码行。当我尝试编译时,编译器将显示错误,如“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;  
  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