C:强制完成模板编译(MSVC / G)

你好,祝你好运.

以下代码片段编译cl.exe(15.00.30729.01)和mingw-g(4.4.0):

template<typename T> class Test{
public:
    T t;
    void error(){
        int doesNotExist = 6;
        return doesNotExist;//<---- void function returning result
    }
};

int main(int argc,char** argv){
    Test<int> test;
    return 0;
}

此外,在cl.exe上你甚至可以逃避这样的事情:

template<typename T> class Test{
public:
    T t;
    void error(){
        doesNotExist = 6;//<---- undeclared variable
        return doesNotExist;//<---- void function returning result
    }
};

现在,这显然是因为编译器在有人调用它们之前不会为模板类的方法创建内容.但是,当您设计大型模板类时,这可能会出现问题(因为您很可能忘记在某处添加测试调用到新方法).

问题:
是否有g或cl.exe的编译器开关会强制编译器处理整个模板(因此这段代码片段会触发编译错误)?

解决方法

如果要使用几种类型测试模板,可以触发类型的手动实例化,如:
// at namespace level
template class Test<int>;

类模板的显式实例化会自动触发所有成员的实例化,这似乎就是您想要的.

实际问题是该语言旨在明确允许您要避免的行为.当隐式实例化类模板时,编译器将仅实例化那些使用的方法.该特性的主要用例是某些方法可能对实例化类型施加比其他方法更严格的要求,如果所有方法都被实例化,那么类模板只能用于那些满足更严格要求的类型.

通过允许编译器仅实例化所使用的那些方法,类模板可以与不满足所有方法的所有要求的类型一起使用,只要它们满足实际使用的方法的要求即可. .

一个常见的例子是std :: map<>中的operator [].这需要value_type是默认可构造的(如果容器中不存在该键并且返回对它的引用,则operator []将创建一个初始化的新对象.只要您不使用operator [](或任何其他强制要求的成员函数),语言中的行为允许您对不可默认构造的类型使用std :: map.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...