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 回答