【发布时间】:2017-08-04 22:03:15
【问题描述】:
我希望我的重载 operator+ 可以用于混合类型。 非模板类没有问题。 为了使它与 template 类一起工作,我在类中添加了一个 friend operator+ 并且它可以工作。
template <typename T> class Wrapper
{
T _val;
public:
Wrapper(T val) :_val(val){}
T getValue() const { return _val; }
friend Wrapper<T> operator+(const Wrapper<T>& val1, const Wrapper<T>& val2)
{
return Wrapper<T>(val1.getValue() + val2.getValue());
}
};
int main()
{
Wrapper<int> v1 = 10; // OK, implicit constructor
Wrapper<int> v2(20);
Wrapper<int> result1 = v1 + v2; // OK, both values are of type Wrapper<int>
Wrapper<int> result2 = v1 + 40; // Ok, casting by implicit constructor works
return 0;
}
现在我想像这样将 operator+ 实现移到类之外:
#include <iostream>
#include <string>
template <typename T> class Wrapper;
template <typename T> Wrapper<T> operator+(const Wrapper<T>& val1, const Wrapper<T>& val2);
template <typename T> class Wrapper
{
T _val;
public:
Wrapper(T val) :_val(val){}
T getValue() const { return _val; }
friend Wrapper<T> operator+ <>(const Wrapper<T>& val1, const Wrapper<T>& val2);
};
// template<class T> Wrapper<T> operator+(const Wrapper<T>&, const Wrapper<T>&)
// template argument deduction/substitution failed
template <typename T> Wrapper<T> operator+(const Wrapper<T>& val1, const Wrapper<T>& val2)
{
return Wrapper<T>(val1.getValue() + val2.getValue());
}
int main()
{
Wrapper<int> v1 = 10; // OK, implicit constructor
Wrapper<int> v2(20);
Wrapper<int> result1 = v1 + v2; // OK, both values are of type Wrapper<int>
// note: mismatched types 'const Wrapper<T>' and 'int'
Wrapper<int> result2 = v1 + 40; // Error
return 0;
}
但它给了我编译错误(将它们粘贴到上面的代码中)。 有办法解决吗?
http://cpp.sh/5j5zg(工作中) http://cpp.sh/9saow(不工作)
【问题讨论】:
-
@justin 是的,伙计,谢谢
-
Related question。简而言之,编译器不会测试每个可能的模板实例化,以查看它们中的任何一个是否支持您正在寻找的隐式转换。
标签: c++ templates metaprogramming