gpt4 book ai didi

c++ - 将运算符专门化为模板参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:31 24 4
gpt4 key购买 nike

我在其他任何地方都找不到这个问题的答案,所以我最终决定问一下。我有一个 C++ 模板化类,其中包含一个参数类型的转换运算符:

template <class E, class B>
class bar {
private:
B innerVal_;
[...]
public:
/* Casting to the type of the 2nd template argument */
operator B() const { return innerVal_; }; // default implementation provided
};

但是,我需要为某些特定的模板参数提供此转换运算符的专门化,例如:

template<>
bar<concreteType,int>::operator int() // <-- whoops, error!
{ [...] }

问题是,无论我如何指定转换运算符的语法,gcc 始终会返回一个与函数声明相关的错误。最常见的是:

error: template-id ‘operator int<>’ for ‘bar< concreteType, int>::operator int()’ does not match any template declaration.

我用这些行得到的:

  • 将转换运算符定义为“operator int()”
  • 使用“operator typeB()”,在原始模板中声明一行“typedef B typeB;”之后

我还尝试使用带有模板括号的“typename”关键字,并进行了其他一些绝望的尝试。所有这些都会导致奇怪的错误——我什至不会在此处粘贴。

我是否丢失了一些明显的细节?你对我有什么提示/指示吗?任何帮助都会很有用。

最佳答案

在 C++ 中,您不能在类的模板参数上特化成员函数。所以这是解决方法:

template <class E, class B>
class bar_base { //base class with 99% of the implementation
private:
B innerVal_;
public:
[...] //most of your members here
};
template <class E, class B>
class bar : public bar_base<E,B> { //normal instantiation
public:
[...] //constructors only
/* Casting to the type of the 2nd template argument */
operator B() const { return innerVal_; }; // default implementation provided
};
template <class E>
class bar<E,int> : public bar_base<E,int> { //E,int specialization
public:
[...] //constructors only
operator int() const { [...]};
};

或者,我认为现在要简单得多:

private:
template<class T>
T convert_to() {return innerVal_; }
template<>
int convert_to<int>() {return innerVal_; }
public:
operator B() const { return convert_to<B>(); };

关于c++ - 将运算符专门化为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8347889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com