0

Eigen 3ライブラリ(http://eigen.tuxfamily.org)を使用する次のコード(C ++ 11)について考えてみます。

#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クラスを使用してのみ発生することを示すためにあります。

誰かがこれが起こっている理由や手がかりを思い付くことができますか?または解決策を投稿しますか?

ありがとうございました!

編集:ubuntu11.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:私は十分に明確ではなかったと思います:私が最も驚いたのは、2番目のテンプレートパラメーターとして固定値を渡すと(bar()の最後の2行のように)、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 に答える