模板类中的Int模板成员函数

时间:2012-04-28 17:21:06

标签: c++ templates boost member boost-test

重复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。是静态的?

谢谢!

2 个答案:

答案 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>();
}