Рассмотрим следующий код (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.