1

const 関数参照 (テンプレート パラメーター内) が必要であることを宣言するにはどうすればよいですか? 例えば、

template< bool (&func)(int arg) >
void foo(int stuff);

しかし、定数?

より具体的には、次のものを でコンパイルしようとするとicpc:

template<bool (&func)(int arg)>
bool id(int arg) {
  return func(arg);
}

class Foo {
 public:
  Foo() {};
  virtual ~Foo() {};
  bool bar(int arg) { return true; }
  bool bar2(int arg) {
    return id<bar>(arg);
  };
};

int main() {
  return 0;
}

私は得る

$ icpc foo.cpp
foo.cpp(12): error: no instance of function template "id" matches the argument list
            argument types are: (int)
      return id<bar>(arg);
             ^
compilation aborted for foo.cpp (code 2)

または、でg++、私は得る

$ g++ foo.cpp
foo.cpp: In member function ‘bool Foo::bar2(int)’:
foo.cpp:13:23: error: no matching function for call to ‘id(int&)’
     return id<bar>(arg);
                       ^
foo.cpp:13:23: note: candidate is:
foo.cpp:2:6: note: template<bool (& func)(int)> bool id(int)
 bool id(int arg) {
      ^
foo.cpp:2:6: note:   template argument deduction/substitution failed:
foo.cpp:13:23: error: could not convert template argument ‘Foo::bar’ to ‘bool (&)(int)’
     return id<bar>(arg);
                       ^

しかし、代わりにバーをトップレベルに移動すると、

template<bool (&func)(int arg)>
bool id(int arg) {
  return func(arg);
}

bool bar(int arg) { return true; }

class Foo {
 public:
  Foo() {};
  virtual ~Foo() {};
  bool bar2(int arg) {
    return id<bar>(arg);
  };
};

int main() {
  return 0;
}

それはうまくコンパイルされます。なぜこれが起こるのですか? バーをグローバルにせずに修正するにはどうすればよいですか?

注: 元のコードでは、「(not const-qualified) は型の値で初期化できません」というエラーが発生していました: (with icpc)

CollisionWorld.cpp(73): error: a reference of type "bool (&)(const Line &, vec_dimension={double}, vec_dimension={double}, vec_dimension={double}, vec_dimension={double})" (not const-qualified) cannot be initialized with a value of type "bool (const Line &, vec_dimension={double}, vec_dimension={double}, vec_dimension={double}, vec_dimension={double})"
    QuadTree<Line, vec_dimension, line_inside_box_with_time> *quad_tree =
                                  ^

(とg++)

CollisionWorld.cpp:73:58: error: could not convert template argument ‘CollisionWorld::line_inside_box_with_time’ to ‘bool (&)(const Line&, double, double, double, double)’
   QuadTree<Line, vec_dimension, line_inside_box_with_time> *quad_tree =
                                                          ^
4

2 に答える 2

1

問題は、テンプレートがメンバー関数ではなく、フリー関数を期待していることです。そのため、Foo から bar() を入れると機能します。

次のようにしてみてください。

template<typename C, bool (C::*func)(int arg)>
bool id(C *mthis, int arg) {
  return (mthis->*func)(arg);
}

class Foo {
 public:
  Foo() {};
  virtual ~Foo() {};
  bool bar(int arg) { return true; }
  bool bar2(int arg) {
    return id<Foo, &Foo::bar>(this, arg);
  };
};
于 2012-10-13T21:44:31.193 に答える
0

thisメンバー関数を呼び出すには、ポインターと関数の 2 つが必要です。したがって、あなたがそれを書くほど簡単にはできません。ポインタidが必要です!this

テンプレート定義は次のようになります。

template<bool (Foo::*func)(int)>

idただし、関数とメンバー関数の両方で機能する真の関数を実装することはできません。

于 2012-10-13T21:54:48.310 に答える