#include <iostream>
struct A
{
bool f( int a ) { std::cout << "int" << std::endl; return true;};
bool f( int a, int b ) { std::cout << "two int" << std::endl; return true;};
bool f( float a ) {std::cout << "float" << std::endl; return true;};
bool f( float a, float b ) {std::cout << "two float" << std::endl; return true;};
};
template <typename T>
struct Type
{
typedef bool (A::*One)(T);
typedef bool (A::*Two)(T, T);
};
template <typename T, typename Type<T>::One F >
void run(A & a)
{
T tmp = 0;
(a.*F)(tmp);
}
int main(int argc, char ** argv )
{
A a;
run<int, &A::f>(a);
run<float, &A::f>(a);
return 0;
}
问题在于typename Type<T>::One F
的语法。如果我指定实际的方法指针而不是使用Type
中的typedef,它可以正常工作(请参阅here和here)。
有没有办法使用Type
中的那些typedef作为模板参数?
答案 0 :(得分:1)
我目前的猜测是IBM xlC和Sun CC都有错误。
提供错误的版本可能会因模板参数上下文中typename
的使用而混淆,但用于表示依赖名称是一种类型而不是引入类型参数。请注意,这些编译器不符合要求,并且不要求typename
指示依赖名称是一种类型,即使在需要它的其他上下文中也是如此(即使对于代码编译的Sun CC版本)