3

これの重複した質問。

私はこのようなクラスを持っています:

template <class T>
class foo {
public:        

    foo(){}

    template <int S>
    void bar (){}

}

このクラスが次のように呼び出された場合:

int main(){
    foo<float> m;
    m.bar<1>();
}

エラーが発生します:

エラー:')'トークンの前にプライマリ式が必要です

再び非推奨:

私のコードは次のとおりです。

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN

#include <boost/mpl/list.hpp>
#include <boost/test/unit_test.hpp>
#include <boost/test/test_case_template.hpp>
using namespace boost::unit_test;

#include "foo.hpp"

BOOST_AUTO_TEST_SUITE();

typedef boost::mpl::list<char, int> test_types;

BOOST_AUTO_TEST_CASE_TEMPLATE(test_Mat_constructor_hwd, T, test_types){

    foo<T> m;
    m.bar<1>();
}

BOOST_AUTO_TEST_SUITE_END()

ただし、BOOST_AUTO_TEST_CASE_TEMPLATEが奇妙なことをしているため、これはコンパイルされません...

次のテキストは非推奨です。

ただし、次のコマンドで関数を呼び出すと、次のようになります。

foo f;
f.bar<1>();

エラーが発生しました:

バインドされたメンバー関数は呼び出すことしかできません

ただし、bar関数をvoid bar1(){return bar <1>();}のようなものにラップすると、機能します。コンパイル時にTがわからない場合は、コンパイルされません。しかし、なぜコンパイラがf.bar <1>の1が静的であるかを理解するのに十分賢くないのかわかりませんか?

ありがとう!

4

2 に答える 2

2

テスト関数を解析するときにT引数が不明であるため、コンパイラーはm.bar式が何であるかを判別できず、したがって、それが非テンプレート変数であると想定します。m.bar<1>()したがって、はとして解析され(m.bar<1)>()、最後のビットは不正です。bar修正は、それがテンプレートであることを明示的に述べることです。

foo<T> m;
m.template bar<1>();
于 2012-04-28T19:00:27.823 に答える
1

メンバー関数を外部から呼び出す場合は、メンバー関数を公開する必要があります。これは、私のコンパイラでは問題なく動作します。

class foo {
public:
    foo(){}

    template <int T>
    void bar (){}
 };

int main(){
    foo f;
    f.bar<1>();
}
于 2012-04-28T17:24:15.653 に答える