为什么在有时需要类型作为指针的地方使用模板类型时会出现错误 C2768?
Why do I get error C2768 with using template type where I need the type as pointer sometimes?
我有一个 class CMyObject,它有一些 getter 函数来访问各种成员(例如 CTheValueHolder 类型的成员),而这些成员又有一个 setter 用于每个双精度值。此调用链需要应用于列表中 CMyObject 类型的所有项目,访问的 classes 及其 setter 函数在整个代码中随机变化。为了保持代码简短,我想使用一种方法,我可以将所有 getter 函数传递给 CMyObject 实例上的另一个对象 (CTheValueHolder),在该对象上执行的函数和要设置的值。
代码如下所示:
// header
class CMyService
{
template <typename T> void ApplyToList(T* (CMyObject::*getMember)(), void (T::*memberFunction)(double), double iNewValue);
}
// implementation
template <typename T>
void CMyService::ApplyToList<T>(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)
{
(((*iter)->*getMember)->*memberFunction)(iNewValue);
}
}
}
CMyObject::*getMember 可能如下所示:
CTheValueHolder* CMyObject::GetTheValueHolder()
{
return m_pTheValueHolder;
}
而 CTheValueHolder 可能定义为:
class CTheValueHolder
{
// ....
void SomeValueSetter(double fNewValue);
// ....
}
因此:
// call from within CMyService
void CMyService::SomeFunction()
{
// ....
double fSomeNewValue = 123.456;
ApplyToList<CTheValueHolder>(&CMyObject::GetTheValueHolder, &CTheValueHolder::SomeValueSetter, fSomeNewValue);
// ....
}
我得到错误 C2768:'CMyService::ApplyToList':非法使用显式模板参数。
任何想法为什么以及如何使这项工作?
顺便说一句:我目前坚持使用 VS2010,所以我没有成熟的 C++11 可用。
您对模板函数的外联定义是错误的。如果您在 模板名称 之后明确指定模板参数(例如,CMyService::ApplyToList<T>
中的 <T>
),则您指定了一个特化。在这种情况下是部分特化,因为特化仍然有模板参数。而且你不能部分特化函数。
template<class T> void Foo(); // declaration
// Don't do this:
template<class T> void Foo<T>() { /* implementation */ }
// Do this:
template<class T> void Foo() { /* implementation */ }
// ^^^ Note the missing <T>
我有一个 class CMyObject,它有一些 getter 函数来访问各种成员(例如 CTheValueHolder 类型的成员),而这些成员又有一个 setter 用于每个双精度值。此调用链需要应用于列表中 CMyObject 类型的所有项目,访问的 classes 及其 setter 函数在整个代码中随机变化。为了保持代码简短,我想使用一种方法,我可以将所有 getter 函数传递给 CMyObject 实例上的另一个对象 (CTheValueHolder),在该对象上执行的函数和要设置的值。
代码如下所示:
// header
class CMyService
{
template <typename T> void ApplyToList(T* (CMyObject::*getMember)(), void (T::*memberFunction)(double), double iNewValue);
}
// implementation
template <typename T>
void CMyService::ApplyToList<T>(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)
{
(((*iter)->*getMember)->*memberFunction)(iNewValue);
}
}
}
CMyObject::*getMember 可能如下所示:
CTheValueHolder* CMyObject::GetTheValueHolder()
{
return m_pTheValueHolder;
}
而 CTheValueHolder 可能定义为:
class CTheValueHolder
{
// ....
void SomeValueSetter(double fNewValue);
// ....
}
因此:
// call from within CMyService
void CMyService::SomeFunction()
{
// ....
double fSomeNewValue = 123.456;
ApplyToList<CTheValueHolder>(&CMyObject::GetTheValueHolder, &CTheValueHolder::SomeValueSetter, fSomeNewValue);
// ....
}
我得到错误 C2768:'CMyService::ApplyToList':非法使用显式模板参数。 任何想法为什么以及如何使这项工作? 顺便说一句:我目前坚持使用 VS2010,所以我没有成熟的 C++11 可用。
您对模板函数的外联定义是错误的。如果您在 模板名称 之后明确指定模板参数(例如,CMyService::ApplyToList<T>
中的 <T>
),则您指定了一个特化。在这种情况下是部分特化,因为特化仍然有模板参数。而且你不能部分特化函数。
template<class T> void Foo(); // declaration
// Don't do this:
template<class T> void Foo<T>() { /* implementation */ }
// Do this:
template<class T> void Foo() { /* implementation */ }
// ^^^ Note the missing <T>