相关疑难解决方法(0)

二进制运算符在模板类上重载

我最近试图测量我的运算符重载/模板能力,并作为一个小测试,创建下面的Container类.虽然此代码编译良好并且在MSVC 2008(显示11)下正常工作,但MinGW/GCC和Comeau都会在operator+重载时阻塞.因为我比MSVC更信任他们,所以我想弄清楚我做错了什么.

这是代码:

#include <iostream>

using namespace std;

template <typename T>
class Container
{
      friend Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs);
   public: void setobj(T ob);
     T getobj();
      private: T obj;
};

template <typename T>
void Container<T>::setobj(T ob)
{
   obj = ob;
}

template <typename T>
T Container<T>::getobj()
{
   return obj;
}

template <typename T>
Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs)
{
      Container<T> temp;
      temp.obj = lhs.obj + rhs.obj;
      return temp;
}

int main()
{    
    Container<int> a, …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading operators

6
推荐指数
1
解决办法
5550
查看次数

c ++用于模板类的用户定义运算符的隐式转换

我有一个结构模板A<x>和一个+运算符int.

#include <iostream>
template<int x>
struct A{
    int a;  
};
template<int x>
int operator+(A<x> a, int b){
    return a.a+b;
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个B<x>可转换为的结构模板A<x>.

template<int x>
struct B{
    int b=3;
    operator A<x>(){
        return {b+10};
    }
};
Run Code Online (Sandbox Code Playgroud)

现在我希望在打电话时B<x>转换成.A<x>B<x> + int

int main(){
    std::cout<<(A<12>{9}+10)<<std::endl;//OK
    std::cout<<(B<12>{9}+10)<<std::endl;//Error
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在重载模板类的运算符时读取了隐式转换并写了

template<int x>
struct B{
    int b=3;
    operator A<x>(){
        return {b+10};
    }
    friend int operator+(A<x> a, int b);
}; …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading friend-function c++14

5
推荐指数
2
解决办法
649
查看次数

C++加法过载模糊

我在我的代码库中遇到了一个棘手的难题.我不知道为什么我的代码会生成此错误,但(例如)std :: string则不然.

class String {
public:
    String(const char*str);
    friend String operator+ ( const String& lval, const char *rval );
    friend String operator+ ( const char *lval, const String& rval );
    String operator+ ( const String& rval );
};
Run Code Online (Sandbox Code Playgroud)

这些的实现很容易想象你自己.

我的驱动程序包含以下内容:

String result, lval("left side "), rval("of string");
char lv[] = "right side ", rv[] = "of string";
result = lv + rval;
printf(result);
result = (lval + rv);
printf(result);
Run Code Online (Sandbox Code Playgroud)

这在gcc 4.1.2中生成以下错误:

driver.cpp:25: error: ISO C++ says that these are …
Run Code Online (Sandbox Code Playgroud)

c++ gcc operator-overloading stdstring

2
推荐指数
2
解决办法
5123
查看次数

类型扣除/替换失败

请考虑以下示例.

#include <string>


template<class CharT, class Traits = std::char_traits<CharT >, class Allocator = std::allocator<CharT >>
void f(const std::basic_string<CharT, Traits, Allocator>& s) {
}

int main() {
     f("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)

在编译时,我得到了

不匹配的类型 ‘const std::basic_string<_CharT, _Traits, _Alloc>’ and ‘const char []’

为什么编译器不能扣除"CharT"并进行相应的转换basic_string<>?我想只有一个f()签名对任何转换为basic_string<>存在的参数类型有效,是否有解决此问题的方法?

c++

2
推荐指数
1
解决办法
898
查看次数