const 함수 참조 (템플릿 매개 변수)를 원한다는 것을 어떻게 선언합니까? 예 :const 템플릿 매개 변수의 함수에 대한 const 참조?
template< bool (&func)(int arg) >
void foo(int stuff);
하지만 const? 나는 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;
}
내가 g++
로,
$ 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++ 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);
^
그러나 경우 대신
에서와 같이 바를 최상위로 이동합니다.210template<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;
}
잘 컴파일됩니다. 왜 이런 일이 일어나고, 바를 글로벌화하지 않고 어떻게 해결할 수 있습니까?
참고 : (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 =
^
const와는 아무런 관련이 없습니다. 멤버 함수는 함수가 아닙니다! –
@KerrekSB 멤버 함수는 함수입니다. 멤버 함수를 호출하지 않고 멤버 함수의 이름을 지정하면 함수 유형의 rvalue 표현식이됩니다. 아마도 그들은 좋은 진단을 제공하려고 시도하고 이니셜 라이저가 rvalue인지 여부를 확인했지만 멤버 함수 초기화 프로그램을 잊어 버렸을 것입니다. –
@ JohannesSchaub-litb : 함수를 호출 할 수는 있지만 멤버 함수는 호출 할 수 없습니다. 당신은 * 객체 *가 필요합니다. 그것은 많은 사람들이 작은 콜백을 시도 할 때 혼란 스러울 정도로 사람들이 실제로 어떤 기능을하는지 생각하게하는 희망에서이 급진적 성명서를 시험해보고 싶습니다. –