C ++模板中的非法间接

时间:2013-04-30 01:33:57

标签: c++ templates indirection

我有一个模板类,一旦它获得string T而另一个Para*获得T。 我为<<重载Para

friend ostream& operator<< (ostream &wyjscie, Para const& ex){
        wyjscie << "(" << ex.wrt << ", " << ex.liczbaWystapien <<")"<< endl;
        return wyjscie;
    }

所以要打印它我必须使用cout<<*objectOfClassPara<<endl;否则我会打印 地址,但我无法为string执行此操作。

如何更正此代码udner?

T t = n->key;
            //cout<<n->key<<endl;
            cout<<t<<endl;
            if (is_same<T, Para*>::value){
                cout<<*t<<endl; //IILEGAL INDIRECTION
            }

2 个答案:

答案 0 :(得分:2)

您的问题是if运行时,如果检查,并且所有可能的类型都必须编译,无论代码是否实际执行。因此,当Tstring时,*会导致代码失败。

最简单的解决方案是提供一个使用指针的重载operator<<并移除*

ostream& operator<< (ostream &wyjscie, Para const* ex)
{
    return wyjscie << *ex;
}

答案 1 :(得分:1)

T t

不是指针,如0x499602D2提到..

T* t

是一个指针,可以解除引用,如cout<<*t<<endl;模板参数需要类型指向类型指针无效。< / p>