これの重複した質問。
私はこのようなクラスを持っています:
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が静的であるかを理解するのに十分賢くないのかわかりませんか?
ありがとう!