函数指针在模板函数内

时间:2015-11-20 16:57:24

标签: c++ c++11

你好,我用c ++和我坚持这个问题。我有模板类,你可以看到下面有另一个模板方法PrintSpecificObject。在实际项目中,我有一组不同的对象,我需要例如打印只是可以投射的对象" K"。无论如何,我的问题是" PrintThatObject"方法或者用我在main中调用它的方法。  谢谢你的帮助。

     template<typename T>
        class Foo {
        public:
            std::vector<T*> v;

            template<typename K>
            void PrintSpecificObject(void(*uFunc)(K*)) {
                for (std::vector<T*>::iterator i = begin(); i != end(); ++i) {
                    if (dynamic_cast<K*>(i) != nullptr) {
                       PrintThatObject(i);    //<------- There i call it
                    }
                }
            }

          //<------- How this method shoud look? ------>
            void PrintThatObject(int i) {
                std::cout << i;
            }
        };

    int main() {
        Foo<int*> f;
        f.PrintSpecificObject<int>(f.PrintThatObject); // Error C3867
        f.PrintSpecificObject<int>(&Foo<int*>::PrintThatObject); // Error C2664
      //  <------- Or How should i call that method?  -------> 
  }

1 个答案:

答案 0 :(得分:1)

您无法将PrintThatObject的任何表示传递给PrintSpecificObject。问题是PrintSpecificObject接受一个函数指针。 PrintThatObject是成员函数。 Huge difference

您可以修复PrintSpecificObject,或者只是添加一个重载,它不会有歧义,如下所示:

template < typename Object, typename K >
void PrintSpecificObject(Object * o, void (Object::*fun)(K*))
{
    //...whatever...
    // call function
    o->*fun(some_k);
}

您拨打f.PrintSpecificObject<int>(&Foo<?>::PrintThatObject)

?是你传递给Foo以实例化f的类的任何类型。