【问题标题】:Int template member function within a template class模板类中的 int 模板成员函数
【发布时间】:2012-04-28 17:21:06
【问题描述】:

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();} 的东西,它会起作用。我知道如果在编译期间不知道 T,它将无法编译。但是我不知道为什么编译器不够聪明,无法确定 f.bar 中的 1 是静态的?

谢谢!

【问题讨论】:

  • 我认为您可能遗漏了部分错误消息——这没有任何意义。
  • 请将失败的程序缩减为最短的完整程序,但仍然失败。您可能会在此过程中发现您的解决方案。如果没有,请在您的问题中发布 short(提示:它应该少于 20 行)、complete(我们应该能够尝试编译它)程序对于更多信息,请参阅sscce.org

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


【解决方案1】:

由于在解析测试函数时 T 参数未知,编译器无法确定m.bar 表达式是什么,因此假定它是一个非模板变量。 m.bar&lt;1&gt;() 被解析为(m.bar&lt;1)&gt;(),最后一位是非法的。解决方法是明确声明 bar 是一个模板:

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

【讨论】:

    【解决方案2】:

    如果你想在外部调用成员函数,你需要将它们公开,这在我的编译器上工作正常

    class foo {
    public:
        foo(){}
    
        template <int T>
        void bar (){}
     };
    
    int main(){
        foo f;
        f.bar<1>();
    }
    

    【讨论】:

    • 哦,对不起,我忘了在这个更简化的例子中公开
    • @YCHAI -- 简化示例有效,这就是问题所在。向我们展示一些没有的东西。
    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多