C++ 重载运算符的模板:错误:重载';操作员*';必须至少有一个类或枚举类型的参数
我想在具有各种组件的结构上定义一个向量空间(即,按组件进行的标量加法和乘法)。因此,在这个简短的示例中,我为特定的结构重载C++ 重载运算符的模板:错误:重载';操作员*';必须至少有一个类或枚举类型的参数,c++,templates,operator-overloading,C++,Templates,Operator Overloading,我想在具有各种组件的结构上定义一个向量空间(即,按组件进行的标量加法和乘法)。因此,在这个简短的示例中,我为特定的结构重载操作符*=,然后在模板中为任何操作符*使用它 编译并运行以下代码: #include <assert.h> struct myfloat3 { float x, y, z; }; myfloat3 operator*=(myfloat3& a, const float b) { a.x *= b; a.y *= b; a.z *= b;
操作符*=
,然后在模板中为任何操作符*
使用它
编译并运行以下代码:
#include <assert.h>
struct myfloat3 { float x, y, z; };
myfloat3 operator*=(myfloat3& a, const float b) {
a.x *= b; a.y *= b; a.z *= b;
return a;
}
template<typename Pt>
Pt operator*(const Pt& a, const float b) {
auto prod = a;
prod *= b;
return prod;
}
// template<typename Pt>
// Pt operator*(const float b, const Pt& a) {
// auto prod = a;
// prod *= b;
// return prod;
// }
int main(int argc, char const *argv[]) {
myfloat3 x {1, 2, 3};
assert((x*3.0f).x == 3);
return 0;
}
但是,使用不同的编译器可以工作:
$ g++ --version
g++ (Ubuntu 4.9.2-10ubuntu13) 4.9.2
$ g++ -std=c++11 sandbox/soverload.cpp
有什么想法吗?使用trait类和
enable\u if
来控制模板的启用时间:
template<typename Pt> struct Is_vector: public std::false_type {};
template<> struct Is_vector<float3>: public std::true_type {};
template<typename Pt>
typename std::enable_if<Is_vector<Pt>::value, Pt>::type
operator*(const Pt& a, const float b) {
auto prod = a;
prod *= b;
return prod;
}
template<typename Pt>
typename std::enable_if<Is_vector<Pt>::value, Pt>::type
operator*(const float b, const Pt& a) {
auto prod = a;
prod *= b;
return prod;
}
模板结构是_向量:public std::false_type{};
模板结构是_向量:public std::true_type{};
模板
typename std::enable_if::type
操作员*(常数Pt&a、常数浮点b){
自动生产=a;
prod*=b;
返回产品;
}
模板
typename std::enable_if::type
操作员*(常数浮点b、常数Pt&a){
自动生产=a;
prod*=b;
返回产品;
}
有关说明,请参阅和。如果启用模板,请使用带有
启用\u的trait类来控制启用模板的时间:
template<typename Pt> struct Is_vector: public std::false_type {};
template<> struct Is_vector<float3>: public std::true_type {};
template<typename Pt>
typename std::enable_if<Is_vector<Pt>::value, Pt>::type
operator*(const Pt& a, const float b) {
auto prod = a;
prod *= b;
return prod;
}
template<typename Pt>
typename std::enable_if<Is_vector<Pt>::value, Pt>::type
operator*(const float b, const Pt& a) {
auto prod = a;
prod *= b;
return prod;
}
模板结构是_向量:public std::false_type{};
模板结构是_向量:public std::true_type{};
模板
typename std::enable_if::type
操作员*(常数Pt&a、常数浮点b){
自动生产=a;
prod*=b;
返回产品;
}
模板
typename std::enable_if::type
操作员*(常数浮点b、常数Pt&a){
自动生产=a;
prod*=b;
返回产品;
}
请参阅和以获取解释。是相关的,但请注意对已接受答案的评论。谢谢,当我带着编译器回到笔记本电脑上时,我将尝试此SFINA魔术。是相关的,但请注意对已接受答案的评论。谢谢,当我带着编译器回到笔记本电脑上时,我将尝试这个SFINA魔术。