Создание экземпляра шаблона - нет соответствующей функции при использовании оператора C ++ 11 sizeof ... () с определенными классами - PullRequest
0 голосов
/ 17 февраля 2012

Рассмотрим следующий код (C ++ 11), который использует библиотеку Eigen 3 (http://eigen.tuxfamily.org):

#include <iostream>
#include <Eigen/Core>

template<typename T, int x, int y>
class mat {
        public:
        private:
                T data[x*y];
};

class bazinga {
        public:
                template<typename T>
                static void static_foo() {
                        std::cout << "STATIC BAZINGA FOO!\n";
                }

                template<typename T>
                void foo() {
                        std::cout << "BAZINGA FOO!\n";
                }
};

template<typename T>
void direct_foo() {
        std::cout << "JUST FOO-IN'!\n";
}

template<int i, int ... is>
void bar( bazinga &bz) {

        direct_foo<          mat<float, sizeof...(is), 3> >(); // OK
        bazinga::static_foo< mat<float, sizeof...(is), 3> >(); // OK
        bz.foo<              mat<float, sizeof...(is), 3> >(); // OK

        direct_foo<          Eigen::Matrix<float, sizeof...(is), 3> >(); // OK
        bazinga::static_foo< Eigen::Matrix<float, sizeof...(is), 3> >(); // ERROR
        bz.foo<              Eigen::Matrix<float, sizeof...(is), 3> >(); // ERROR

        bazinga::static_foo< Eigen::Matrix<float, 3, 3> >(); // OK!!!
        bz.foo<              Eigen::Matrix<float, 3, 3> >(); // OK!!!
}

int main() {
        bazinga bz;
        bar<1,2,3,4>(bz);
}

Класс «mat» как раз там, чтобы продемонстрировать, что ошибки не возникают с использованием собственных классов, нотолько с классом Eigen :: Matrix.

Может кто-нибудь придумать причину или понять, почему это происходит? Или опубликовать решение?

Спасибо!

РЕДАКТИРОВАТЬ: я использую g ++ 4.6.1 на Ubuntu 11.10 вот вывод компилятора:

main.cpp: In function ‘void bar(bazinga&) [with int i = 1, int ...is = {2, 3, 4}]’:
main.cpp:46:24:   instantiated from here
main.cpp:37:9: error: no matching function for call to ‘bazinga::static_foo()’
main.cpp:37:9: note: candidate is:
main.cpp:14:29: note: template<class T> static void bazinga::static_foo()
main.cpp:38:9: error: no matching function for call to ‘bazinga::foo()’
main.cpp:38:9: note: candidate is:
main.cpp:19:22: note: template<class T> void bazinga::foo()

EDIT2: я думаю, я не был достаточно ясен: что меня больше всего удивляет, что, если я передам фиксированное значение в качестве второгоПараметр шаблона (как в последних двух строках bar ()) все работает нормально, только использование оператора sizeof ... () приводит к ошибкам и только при использовании с Eigen :: Matrix.

1 Ответ

1 голос
/ 17 февраля 2012

Я думаю, что это ошибка компилятора, поскольку передача целочисленного литерала работает нормально, но sizeof...(is) не работает.Поэтому я бы предложил вам попробовать это:

constexpr int s = sizeof...(is);
bazinga::static_foo< Eigen::Matrix<float, s, 3> >();
bz.foo<              Eigen::Matrix<float, s, 3> >(); 
...