与cout的歧义<<并转换c ++

时间:2015-04-04 19:23:56

标签: c++ casting

对于练习,我在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++

2 个答案:

答案 0 :(得分:3)

如果您为<<的{​​{1}}运算符重载,则代码可以正常工作。

pure<T>

答案 1 :(得分:2)

请参阅Why do C++11-deleted functions participate in overload resolution?了解原因

 cout << i << endl;

不起作用。

解决方法:

  1. 提供适当的operator<<()重载。

  2. 删除明确删除的强制转换运算符。

  3. 以下代码有效:

    #include <iostream>
    
    template <typename T>
    class pure
    {
       public:
          operator T()
          {
             return 0;
          }
    
    };
    
    int main()
    {
       pure<int> p;
       std::cout << p << std::endl;
    }