gpt4 book ai didi

c++ - msvc 11 仅在某些情况下尊重 C++ 外部模板

转载 作者:行者123 更新时间:2023-11-30 02:03:08 25 4
gpt4 key购买 nike

我正在使用 C++ 外部模板来加快编译速度。我注意到 Visual Studio 2012 在处理 extern template 方面做了一些改进。 ,但我仍然发现问题。这是一个例子:

ma​​in.cpp:

#include <iostream>
#include "Calc.h"

using namespace std;

int main(int argc, char** argv)
{
Calc<int> c1;
cout << c1.add(1, 2) << endl;
}

计算.h:

#pragma once

template <class A_Type>
class Calc
{
public:
A_Type add(A_Type x, A_Type y)
{
return x + y;
}
};

extern template class Calc<int>;

通常我会将 Calc.cpp 包含在 template class Calc<int>; 中,确保模板只实例化一次。对于这个例子,我只是编译 Main.cpp 并预计它会失败。

问题是,Visual Studio 2012 会愉快地编译和链接上面的代码。它不尊重 extern template .我找到的唯一解决方案是在 header 中执行此操作:

计算.h:

#pragma once

template <class A_Type>
class Calc
{
public:
A_Type add(A_Type x, A_Type y);
};

template <class A_Type> A_Type Calc<A_Type>::add(A_Type x, A_Type y)
{
return x + y;
}

extern template class Calc<int>;

如果 header 是这样的,Visual Studio 将无法链接(正如预期的那样提示 Calc<int>::add 缺少定义)。 但是g++ 4.6.3 无法链接这些示例中的任何一个。

谁是对的?如果一个类中函数的原型(prototype)和定义都在同一个头文件中指定,真的有区别吗?有什么方法可以指定“较短格式”Calc.h 并使其在 Visual Studio 2012(以及 gcc)中按预期失败?

最佳答案

如果编译器选择这样做,它可以自由地内联它具有定义的任何函数。一旦内联,就不需要在另一个文件中进行另一个定义。

关于c++ - msvc 11 仅在某些情况下尊重 C++ 外部模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12362024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com