C ++模板:如果我们在模板类中放入错误的东西会发生什么

时间:2011-07-02 14:27:59

标签: c++ templates

C ++模板允许我们使用模板参数在对象中放置任何内容。但是,如果我们的模板参数使用属于某些类型的函数/变量,我们如何检查?

template<typename BarType>rguments

class Foo {

public:

     Foo() { bar = new BarType() }

private:

     BarType * bar;

}

Foo<Bar> …

BarType可以是从Bar超类派生的任何东西。

如果我们在Foo类中调用一些只属于Bar的函数会发生什么?如果我们传递非BarType会发生什么?我们还有检查吗?

4 个答案:

答案 0 :(得分:4)

如果模板化代码引用了当您尝试实例化模板时实际参数未提供的成员,则会出现编译时错误。所以不要担心,你将无法破坏任何东西。

将模板视为代码生成机制。生成的代码实际上是否有意义有时只能在您实际尝试时确定。

答案 1 :(得分:2)

鉴于下面的类模板TempFoo,您会看到它在其构造函数中调用模板化example类型的T函数。前两种类型有效,因为它们都定义example;第三个没有。

template<typename T>
class TempFoo
{
    void TempFoo() {
        T obj;
        obj.example();
    }
};

class First {
    void example() {}
};

class Second {
    void example() {}
};

class Third {
};

int main()
{
     TempFoo<First> f; // works
     TempFoo<Second> s; // works
     TempFoo<Third> t; // doesn't

}

答案 2 :(得分:1)

无论你在tempalte参数列表中给出什么,都是一个简单的占位符。编译器将根据用于实例化模板类的对象类型以适当的类型进行重新编译。如果对象不满足函数中的操作,则将出现编译时错误。使用'T'作为占位符也是一种很好的做法。

答案 3 :(得分:0)

确保模板参数派生自基类的简单方法:

template<typename BarType>
class Foo 
{
    // ...
    ~Foo() { Bar* p = (BarType*)0; }
};

编译器将对分配进行类型检查,如果Bar不是BarType的明确超类型,则生成错误,然后优化掉未使用的局部变量。