C++ 模板实例化-使用C++;11';具有特定类的s sizeof…()运算符

C++ 模板实例化-使用C++;11';具有特定类的s sizeof…()运算符,c++,templates,c++11,eigen,C++,Templates,C++11,Eigen,考虑下面的代码(C++11),它使用了Eigen 3库(http://eigen.tuxfamily.org): #包括 #包括 模板 班垫{ 公众: 私人: T数据[x*y]; }; 巴辛加班{ 公众: 模板 静态无效静态_foo(){ std::cout();//好的 直接_foo();//确定 bazinga::static_foo();//错误 bz.foo();//错误 bazinga::static_foo();//好的!!! foo();//好的!!! } int main(){

考虑下面的代码(C++11),它使用了Eigen 3库(http://eigen.tuxfamily.org):

#包括
#包括
模板
班垫{
公众:
私人:
T数据[x*y];
};
巴辛加班{
公众:
模板
静态无效静态_foo(){
std::cout();//好的
直接_foo();//确定
bazinga::static_foo();//错误
bz.foo();//错误
bazinga::static_foo();//好的!!!
foo();//好的!!!
}
int main(){
巴辛加bz;
巴(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()
main.cpp:在函数“void bar(bazinga&)[with int i=1,int…is={2,3,4}]中:
main.cpp:46:24:从此处实例化
main.cpp:37:9:错误:调用“bazinga::static_foo()”时没有匹配的函数
main.cpp:37:9:注:候选人为:
main.cpp:14:29:注意:模板静态void bazinga::static_foo()
main.cpp:38:9:错误:调用“bazinga::foo()”时没有匹配的函数
main.cpp:38:9:注:候选人为:
main.cpp:19:22:注意:模板void bazinga::foo()

EDIT2:我想我还不够清楚:最让我吃惊的是,如果我传递一个固定值作为第二个模板参数(如bar()的最后两行),一切都会正常工作,只使用sizeof…()运算符会导致错误,并且只有在与Eigen::Matrix一起使用时才会出现错误。

我认为这是一个编译器错误,因为传递整数文本可以正常工作,但
sizeof…(is)
不起作用。因此我建议您尝试以下方法:

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

您使用的是Eigen的名称空间吗?它是什么版本的Eigen?2还是3?我显式地声明了名称空间(Eigen::Matrix)。谢谢,这就解决了它。有趣的是,我使用了一个类似的constepr函数(template constepr sz(){return sizeof…(is);})尝试了类似的方法,但没有成功。
constexpr int s = sizeof...(is);
bazinga::static_foo< Eigen::Matrix<float, s, 3> >();
bz.foo<              Eigen::Matrix<float, s, 3> >();