由其他模板类的内部typedef定义的类型的模板参数

时间:2011-12-16 10:39:17

标签: c++ templates typedef

#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,它可以正常工作(请参阅herehere)。 有没有办法使用Type中的那些typedef作为模板参数?

1 个答案:

答案 0 :(得分:1)

我目前的猜测是IBM xlC和Sun CC都有错误。

提供错误的版本可能会因模板参数上下文中typename的使用而混淆,但用于表示依赖名称是一种类型而不是引入类型参数。请注意,这些编译器不符合要求,并且不要求typename指示依赖名称是一种类型,即使在需要它的其他上下文中也是如此(即使对于代码编译的Sun CC版本)