为什么在有时需要类型作为指针的地方使用模板类型时会出现错误 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>