模板实例化 - 使用 C++11 的大小时没有匹配函数...() 具有某些类的运算符

Template instantiation - no matching function when using C++11's sizeof...() operator with certain classes

本文关键字:函数 运算符 C++11 使用 小时 实例化      更新时间:2023-10-16

考虑下面的代码(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()

编辑2:我想我还不够清楚:最让我惊讶的是,如果我传递一个固定值作为第二个模板参数(如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> >();