Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符的模板:错误:重载';操作员*';必须至少有一个类或枚举类型的参数_C++_Templates_Operator Overloading - Fatal编程技术网

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魔术。