重复this的问题。
我有一个这样的课程:
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&lt; 1&gt;();}之类的东西,它就可以了。我知道如果在编译期间不知道T,它将无法编译。但我不知道为什么编译器不够聪明,无法弄清楚f.bar&lt; 1&gt;中的1。是静态的?
谢谢!
答案 0 :(得分:2)
因为在解析测试函数时T参数是未知的,所以编译器无法确定m.bar
表达式是什么,因此假设它是非模板变量。 m.bar<1>()
被解析为(m.bar<1)>()
,最后一位是非法的。该修复是明确声明bar
是模板:
foo<T> m;
m.template bar<1>();
答案 1 :(得分:1)
如果你想在外部调用它们,你需要公开成员函数,这在我的编译器
上工作正常class foo {
public:
foo(){}
template <int T>
void bar (){}
};
int main(){
foo f;
f.bar<1>();
}