VS2010下使用模板显式参数触发C2768错误的技术求助
解决VS2010中C2768模板函数错误的问题
你遇到的这个C2768: illegal use of explicit template arguments错误,在VS2010里是个典型的模板语法坑,咱们一步步拆解原因和修复方案:
错误根源
1. 成员模板函数的实现语法错误
你在编写CMyService::ApplyToList的实现时,多写了一个冗余的<T>:
// 错误写法 void CMyService::ApplyToList<T>(...)
对于类的成员模板函数,前面已经通过template <typename T>声明了模板参数,函数名后面完全不需要再加<T>——VS2010对这种语法的兼容性极差,直接就会触发非法使用显式模板参数的错误。
2. 成员函数指针调用的括号缺失
你的调用链代码里少了关键的括号:getMember是获取成员对象的函数指针,必须调用它(加())才能拿到T*类型的对象,原代码的写法会让编译器把它当成成员变量指针处理,后续也会触发编译错误。
修复步骤
1. 修正模板函数的实现语法
把实现部分的ApplyToList<T>改成ApplyToList,同时补上调用getMember的括号,确保调用链优先级正确:
template <typename T> void CMyService::ApplyToList(T* (CMyObject::*getMember)(), void (T::*memberFunction)(double), double iNewValue) { std::list<CMyObject*> myList = GetList(); std::list<CMyObject*>::iterator endIter = myList.end(); for (std::list<CMyObject*>::iterator iter = myList.begin(); iter != endIter; ++iter) { if (*iter) { // 修正后:先调用getMember获取目标对象,再调用其setter方法 ( ((*iter)->*getMember())->*memberFunction )(iNewValue); } } }
2. 验证调用代码
你的调用代码本身是合法的,VS2010支持显式指定模板参数的写法,所以可以继续保留:
void CMyService::SomeFunction() { double fSomeNewValue = 123.456; ApplyToList<CTheValueHolder>(&CMyObject::GetTheValueHolder, &CTheValueHolder::SomeValueSetter, fSomeNewValue); }
如果想尝试让编译器自动推导模板参数,也可以去掉<CTheValueHolder>,不过VS2010对成员函数指针的模板参数推导能力有限,显式指定反而更稳妥。
适配VS2010的额外提示
VS2010对C++模板的支持不算完善,比如模板内部的typedef可能会出现兼容性问题,所以尽量保持代码简洁直接,避免过度使用复杂的模板别名特性。
内容的提问来源于stack exchange,提问作者Robin Holenweger
相关产品推荐
相关产品推荐

