【问题标题】:template specialization in classes with new template具有新模板的类中的模板专业化
【发布时间】:2013-11-28 22:01:33
【问题描述】:

我有类似这样的代码:

class test {
template <typename T>
 void func(T rhs);

template <typename V>
void func(std::vector<V> rhs);
};

我可以这样做吗?这似乎是一个专业化,但我必须引入一个新模板。当我尝试这样做时,gcc 也会告诉我这样的错误:

template<>
template<V>
void func(std::vector<V> rhs);

explicit specialization in non-namespace scope
too many template-parameter-lists

【问题讨论】:

  • 没有在您的代码示例中专门针对V。应该是intdoubleMyClass,不是吗?
  • 我尝试使用通用类型和向量的功能,但也具有通用类型。当我尝试这样做时,编译器采用最通用的功能,所以带有 T 的那个。

标签: c++ templates overloading template-specialization


【解决方案1】:

您不需要专门化,只需内联即可:

class test {
    template <typename T>
    void func(T rhs)
    {
    // Your plain T code goes here
    }

    template <typename V>
    void func(std::vector<V> rhs)
    {
    // Your vector specialized code goes here (no extra specialization needed)
    }
};

或者,如果您希望将定义分离到 .tcc 文件中,请执行以下操作:

test.h:

class test {
public:
    template <typename T>
    void func(T rhs);

    template <typename V>
    void func(std::vector<V> rhs);
};

#include "test.tcc"

test.tcc:

template <typename T>
void test::func(T rhs)
{
    std::cout << "Your plain T code goes here" << std::endl;
}

template <typename V>
void test::func(std::vector<V> rhs)
{
    std::cout << "Your vector specialized code goes here" << std::endl;
}

ideone 上的完整工作示例。

【讨论】:

  • 不,从那时起我为我输入的每种类型都有一个类,但我只希望函数具有模板。所以我想要一个函数,让我们说 int、double 等,以及一个用于这些类型的向量的函数。
  • @user2988020 好的,知道了。但是你不想专业化我会说。
  • 那行得通。我有一个转换运算符出错了,所以编译器总是选择错误的函数。但是模板必须在头文件中定义,不是吗?
  • @user2988020 模板必须在头文件中定义 他们是有效的,看#include "test.tcc"。这只是为了避免在其实现中乱扔类接口声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
相关资源
最近更新 更多