我最近试图测量我的运算符重载/模板能力,并作为一个小测试,创建下面的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) 我有一个结构模板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) 我在我的代码库中遇到了一个棘手的难题.我不知道为什么我的代码会生成此错误,但(例如)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) 请考虑以下示例.
#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<>存在的参数类型有效,是否有解决此问题的方法?