C ++ неоднозначная реализация шаблона - PullRequest
3 голосов
/ 28 мая 2010

следующее дает мне неоднозначную реализацию шаблона с помощью nvcc (комбинация интерфейса EDG и g ++). Это действительно неоднозначно, или компилятор не так? Я также выкладываю обходной путь à la boost :: enable_if

template<typename T> struct disable_if_serial { typedef void type; };
template<> struct disable_if_serial<serial_tag> { };

template<int M, int N, typename T>
__device__
//static typename disable_if_serial<T>::type
void add_evaluate_polynomial1(double *R,
                         const double (&C)[M][N], double x,
                         const T &thread) {
    // ...
}

template<size_t M, size_t N>
__device__
static void add_evaluate_polynomial1(double *R,
                                     const double (&C)[M][N], double x,
                                     const serial_tag&) {
    for (size_t i = 0; i < M; ++i)
        add_evaluate_polynomial1(R, C, x, i);
}

// ambiguous template instantiation here.
add_evaluate_polynomial1(R, C, x, serial_tag());  

Ответы [ 2 ]

5 голосов
/ 28 мая 2010

AFAIK, проблема в том, что у вас нетипизированные аргументы нетипизированного типа (то есть M и N здесь int, но size_t здесь) Это означает, что не все назначения шаблонных переменных из одного могут использоваться в другом, что означает, что нет частичного упорядочения, следовательно, сообщение об ошибке.

Объедините типы аргументов шаблонного типа, и это должно работать.

3 голосов
/ 28 мая 2010

Я проверил код на Clang, GCC и Comeau. Comeau отклоняет это, в то время как GCC и Clang принимают это. Я думаю, что для обеих групп компиляторов могут быть сделаны пункты

  • Comeau следует правилу C ++ 03, согласно которому для выводимых аргументов шаблона требуется «точное совпадение (чтобы вычет не зависел от неявных преобразований)». Однако эта спецификация была ужасно занижена и была полностью переписана для C ++ 0x.

  • Clang и GCC, кажется, реализуют переписанное правило, и это правило лучше определяет, что означает "точное соответствие". Эта спецификация подходит для различных типов размеров массива.

В любом случае, если вы хотите нормально работать со всеми компиляторами, тогда действительно перейдите к принятому ответу и измените типы параметров нетипичного типа на общий тип:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...