对于练习,我在C ++ 中编写了一个小课程,不能将其转换为除通用参数T 之外的其他类型:
template <class T>
class pure
{
public:
pure(T const& attr)
{
this->attr = attr;
}
~pure()
{
}
T& operator=(T const& attr)
{
return attr;
}
operator T()
{
return attr;
}
template<typename U>
operator U() = delete;
private:
T attr;
};
这是主要的:
int main()
{
pure<int> i = 15;
//This won't compile, like I wanted
//All the casts to other types than int won't compile
cout << (short)i;
//BUT when I'm using mye pure object without a cast, I get a lot of ambiguities errors
cout << i;
system("PAUSE");
return 0;
}
那么,为什么第二个cout不起作用呢?这应该是有效的,因为我删除了所有其他可能的强制转换而不是int。感谢帮助。重新考虑这一点可能有助于理解:Prevent an object to be casted to any but one type C++
答案 0 :(得分:3)
如果您为<<
的{{1}}运算符重载,则代码可以正常工作。
pure<T>
答案 1 :(得分:2)
请参阅Why do C++11-deleted functions participate in overload resolution?了解原因
cout << i << endl;
不起作用。
解决方法:
提供适当的operator<<()
重载。
删除明确删除的强制转换运算符。
以下代码有效:
#include <iostream>
template <typename T>
class pure
{
public:
operator T()
{
return 0;
}
};
int main()
{
pure<int> p;
std::cout << p << std::endl;
}