0

考虑以下代码 (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 一起使用时。

4

1 回答 1

1

我认为这是一个编译器错误,因为传递整数文字工作正常,但sizeof...(is) 不起作用。所以我建议你试试这个:

constexpr int s = sizeof...(is);
bazinga::static_foo< Eigen::Matrix<float, s, 3> >();
bz.foo<              Eigen::Matrix<float, s, 3> >(); 
于 2012-02-17T18:10:19.027 回答