Шаблонный аргумент типа, который определяется внутренним typedef из другого класса шаблона - PullRequest
1 голос
/ 16 декабря 2011
#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. Если я указываю фактический указатель на метод вместо использования typedef из Type, он работает нормально (см. здесь и здесь ). Есть ли способ использовать эти typedefs из Type в качестве аргументов шаблона?

1 Ответ

1 голос
/ 16 декабря 2011

Мое текущее предположение состоит в том, что в IBM xlC и Sun CC есть ошибки.

Версии, которые выдают ошибки, вероятно, путают с использованием typename в контексте аргумента шаблона, но используются для указания того, что зависимое имя является типом вместо введения аргумента типа. Обратите внимание, что эти компиляторы не соответствуют и не требуют typename, чтобы указать, что зависимое имя является типом, даже в других контекстах, где это необходимо (даже для версий Sun CC, где компилируется ваш код).

...