void Big(T1& infos)
{
if(1 == a)
lit1(infos);
else
lit2(infos);
}
template <typename T1>
void lit1(T1& infos)
{
..........
}
template <typename T1>
void lit2(T1& infos)
{
............
}
Base模板函数调用了两个模板函数,lit1,lit2,infos为不同结构的容器。
这样编译不通过,传入Base的只能是一种容器,但是要在if else 都要编译通过,除非两个容器方法一致。
请问:如何解决?
谢谢!
14 个解决方案
#1
直接说你到底要干什么吧。
#2
两个类,类中有函数,两个vector保存,
class A1
{
funA1();
};
typedef vector<A1> A1Vec;
class A2
{
funA2();
};
typedef vector<A2> A2Vec;
class A3
{
funA3()
{
A2Vec A2;
Big(A2) ;
}
}
结合上面说的,lit1为A1的实现,lit2为A2的实现。
在funA3中,调用Big函数,其中的if else都会走,导致编译不过。
#3
你还是把代码全部贴出来吧,if和else都要走,是什么意思?
#4
不好意思啊,代码不好贴。if else都做的意思是说,编译的时候都要进行语法检查。
//class A,template fun
class A
{
public:
template <typename T1>
void Big(T1& infos)// 1
{
if(1)
lit1(infos); //2
else
lit2(infos); //3
}
template <typename T1>
void lit1(T1& infos)
{
infos.begin()->fun1(); //2
}
template <typename T1>
void lit2(T1& infos)
{
infos.begin()->fun2(); //3
}
};
// class A1 A2
class A1
{
void funA1()
{
}
};
typedef vector<A1> A1Vec;
class A2
{
void funA2()
{
}
};
typedef vector<A2> A2Vec;
// main class ...
class A3
{
void funA3(const A2Vec& A2 )
{
Big(A2) ; // 1
}
};
funA3函数调用模板函数Big,Big函数下有两个模板函数,分别实现A1和A2类的函数。
这时候,传入的参数如果是A2Vec A2 ,则 标号2处编译不过。
如果解决此种编译错误?
谢了!
#5
这个需求就挺蛋疼的,不行的话你在Big函数中给两个类型参数吧,一个A1Vec,一个A2Vec。
#6
不建议啊,不符合面向对象思想,而且A1 A2方法很多的话,就更不好了。
利用宏怎么样? 通过宏,将lit1 lit2函数传下去 。
#7
你这是八股编程法么。
#8
你把A1和A2里面的funcA1和funcA2改成一个统一的函数名字不行么?
#9
只要测试lit2,和lit1 两个函数就行了
至于那两条路径,看你测试的条件有没有问题
如果没问题,因该可以的,有问题,自然通不过了
其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题
不需要if else 了
至于那两条路径,看你测试的条件有没有问题
如果没问题,因该可以的,有问题,自然通不过了
其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题
不需要if else 了
#10
不清楚八股编程啊。。
#11
这两个函数有不同的传参,里面的实现不一样。
#12
编译期区分分支,可以用模板类型做参数区分,比如TypeToInt<T>,然后特化true和false
#13
abstract class BaseA{
abstract void func();
}
class A1::BaseA
{
void func()
{
}
};
typedef vector<A1> A1Vec;
class A2::BaseA
{
void func()
{
}
};
typedef vector<A2> A2Vec;
class A
{
public:
template <typename T1>
void Big(T1& infos)
{
这里不懂你什么意思,有什么依赖只能这样!
infos.begin()->func();
}
};
#14
template<typename T, typename F>
Big(std::vector<T>& infos, F f)
{
std::for_each(info.begin(), info.end(), f);
}
std::vector<A> va;
Big(va, [](A& a){ a.funA1();});
std::vector<B> vb;
...
Big(vb, [](B& b){ b.funB1();});
#1
直接说你到底要干什么吧。
#2
两个类,类中有函数,两个vector保存,
class A1
{
funA1();
};
typedef vector<A1> A1Vec;
class A2
{
funA2();
};
typedef vector<A2> A2Vec;
class A3
{
funA3()
{
A2Vec A2;
Big(A2) ;
}
}
结合上面说的,lit1为A1的实现,lit2为A2的实现。
在funA3中,调用Big函数,其中的if else都会走,导致编译不过。
#3
你还是把代码全部贴出来吧,if和else都要走,是什么意思?
#4
不好意思啊,代码不好贴。if else都做的意思是说,编译的时候都要进行语法检查。
//class A,template fun
class A
{
public:
template <typename T1>
void Big(T1& infos)// 1
{
if(1)
lit1(infos); //2
else
lit2(infos); //3
}
template <typename T1>
void lit1(T1& infos)
{
infos.begin()->fun1(); //2
}
template <typename T1>
void lit2(T1& infos)
{
infos.begin()->fun2(); //3
}
};
// class A1 A2
class A1
{
void funA1()
{
}
};
typedef vector<A1> A1Vec;
class A2
{
void funA2()
{
}
};
typedef vector<A2> A2Vec;
// main class ...
class A3
{
void funA3(const A2Vec& A2 )
{
Big(A2) ; // 1
}
};
funA3函数调用模板函数Big,Big函数下有两个模板函数,分别实现A1和A2类的函数。
这时候,传入的参数如果是A2Vec A2 ,则 标号2处编译不过。
如果解决此种编译错误?
谢了!
#5
这个需求就挺蛋疼的,不行的话你在Big函数中给两个类型参数吧,一个A1Vec,一个A2Vec。
#6
不建议啊,不符合面向对象思想,而且A1 A2方法很多的话,就更不好了。
利用宏怎么样? 通过宏,将lit1 lit2函数传下去 。
#7
你这是八股编程法么。
#8
你把A1和A2里面的funcA1和funcA2改成一个统一的函数名字不行么?
#9
只要测试lit2,和lit1 两个函数就行了
至于那两条路径,看你测试的条件有没有问题
如果没问题,因该可以的,有问题,自然通不过了
其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题
不需要if else 了
至于那两条路径,看你测试的条件有没有问题
如果没问题,因该可以的,有问题,自然通不过了
其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题
不需要if else 了
#10
不清楚八股编程啊。。
#11
这两个函数有不同的传参,里面的实现不一样。
#12
编译期区分分支,可以用模板类型做参数区分,比如TypeToInt<T>,然后特化true和false
#13
abstract class BaseA{
abstract void func();
}
class A1::BaseA
{
void func()
{
}
};
typedef vector<A1> A1Vec;
class A2::BaseA
{
void func()
{
}
};
typedef vector<A2> A2Vec;
class A
{
public:
template <typename T1>
void Big(T1& infos)
{
这里不懂你什么意思,有什么依赖只能这样!
infos.begin()->func();
}
};
#14
template<typename T, typename F>
Big(std::vector<T>& infos, F f)
{
std::for_each(info.begin(), info.end(), f);
}
std::vector<A> va;
Big(va, [](A& a){ a.funA1();});
std::vector<B> vb;
...
Big(vb, [](B& b){ b.funB1();});