【问题标题】:declaring a templated method inside a templated class在模板化类中声明模板化方法
【发布时间】:2017-08-15 05:36:32
【问题描述】:

我正在尝试将模板化方法添加到模板化类。我提到了this 的答案,但是语法不起作用。我添加了第二种方法,称为tester,我希望将其作为模板。这就是我所拥有的

template <typename t,typename u>
struct foo {

    void test();

    template<typename v>
    void tester(v lhs);
};

template<typename t,typename u>
void foo<t,u>::test() {
    std::cout << "Hello World" ;
}

template<typename t,typename u>
template<typename v>
void foo<t,u>::tester<v>(v lhs) {
    std::cout << "Hello world " << lhs ;
}

int main() 
{
    foo<int,int> t;
    t.test();  
    t.tester<int>(12);
}

我收到方法 tester 的错误,这是我收到的错误

  main.cpp:20:31: error: non-type partial specialization 'tester<v>' is not allowed
 void foo<t,u>::tester<v>(v lhs) {

关于我为什么会收到此错误或我可能做错了什么的任何建议?

【问题讨论】:

  • 如果您尝试专门针对 tester&lt;int&gt;,则删除 typename v 并将 int 用于 lhs 参数
  • 我想看看是否可以模板化方法tester。如果稍后我希望 lhs 成为 string 类型怎么办?
  • 那你不是在尝试部分专业化,那为什么你有tester&lt;int&gt;而不是tester&lt;v&gt;
  • 我不想部分专门化方法测试器。我想知道是否可以在模板化类中模板化方法?链接说是
  • 那么你需要删除&lt;int&gt;部分。首先,你从哪里得到int?其次,你不能对成员函数进行部分特化,所以你想要这个:template&lt;typename t,typename u&gt; &lt;typename v&gt; foo&lt;t,u&gt;::tester(v lhs) { /*...*/ }

标签: c++ templates


【解决方案1】:

在下面更正的代码中内联注释:

#include <iostream>

template <typename t,typename u>
struct foo {

    void test();

    template<typename v>
    void tester(v lhs);
};

template<typename t,typename u>
void foo<t,u>::test() {
    std::cout << "Hello World" ;
}

/*
 * change made to this template function definition
 */
template<typename t,typename u>
template<typename v>
void foo<t,u>::tester(v lhs) {
    std::cout << "Hello world " << lhs ;
}

int main() 
{
    foo<int,int> t;
    t.test();  
    t.tester<int>(12);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多