访问模板外部的模板(类)参数

时间:2015-10-05 11:37:36

标签: c++ templates

是否可以访问模板外的类模板参数的功能?我尝试了以下但没有成功:

class A  {
public:
    void func () { std::cout << ("A called"); }
};

template<class T>
class tClass {
public:
    T* operator->() {
        return mem;
    }

    T* operator*() {
        return mem;
    }

    const T* operator->() const {
        return mem;
    }

    const T* operator*() const {
        return mem;
    }

private:
    T* mem;
};

并在主要:

tClass<A>* t = new tClass<A>();
t->func();

我收到以下编译错误:error: 'class tClass<A>' has no member named 'func' 不覆盖->运算符会返回指向模板参数的指针吗?我问,因为我看到一个非常相似的代码正在运行。我还看到了其他建议使用typedef的答案,但我不确定它在这里是如何应用的。

忽略mem对象现在未初始化的事实。

提前致谢!

2 个答案:

答案 0 :(得分:5)

此:

tClass<A>* t = new tClass<A>();
t->func();

没有调用tClass<A>::operator->,它正在取消引用tClass<A>*本身。并且tClass<A>没有func()成员函数,因此出错。您必须要么双重取消引用:

(*t)->func();

或者使用指向tClass<A>的非指针:

tClass<A> t;
t->func();

旁注,这句话:

  

返回指向模板参数的指针

不对。模板参数是类型。在这种情况下,A。您将返回指向具有该类型的东西的指针 - 而不是类型本身。

答案 1 :(得分:0)

您还需要初始化指针T * mem!,例如

template<class T>
class tClass {
public:
    explicit tClass(T *p):mem(p){}

    T* operator->() {
        return mem;
    }

    T* operator*() {
        return mem;
    }

    const T* operator->() const {
        return mem;
    }

    const T* operator*() const {
        return mem;
    }

private:
    T* mem;
};

然后

tClass<A> t(new A() );

然后继续。