考虑以下代码 (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 类中。
有人能想出为什么会发生这种情况的原因或线索吗?或者发布解决方案?
谢谢!
编辑:我在 ubuntu 11.10 上使用 g++ 4.6.1 这是编译器输出:
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 一起使用时。