我想公开通用Timer
。问题是我不知道为什么extern
带有红色下划线,并且Visual Studio 2019社区说“不允许链接规范”。
extern
的正确语法是什么?
标题utilities.hpp
:
#pragma once
#ifdef UTILITIES_EXPORTS
#define UTILITIES_API __declspec(dllexport)
#else
#define UTILITIES_API __declspec(dllimport)
#endif
namespace Utilities
{
template<typename F>
extern "C" UTILITIES_API void Timer(F f, unsigned int N = 1);
}
定义文件utilities.cpp
:
#include "Timer.h"
#include <iostream>
#include <vector>
#include <chrono>
#include <iomanip>
using namespace std;
namespace Utilities
{
template<typename F>
void Timer(F f, unsigned int N)
{
cout << fixed << setprecision(9);
vector<unsigned int> results;
const double million = 1'000'000'000.0;
for (unsigned int i = 0; i < N; i++)
{
chrono::steady_clock::time_point begin = chrono::steady_clock::now();
f();
chrono::steady_clock::time_point end = chrono::steady_clock::now();
unsigned int interval = chrono::duration_cast<chrono::nanoseconds>(end - begin).count();
results.push_back(interval);
double elapsedTime = interval / million;
cout << "Elapsed: \t\t" << elapsedTime << " s." << endl;
}
unsigned long long sum = 0;
for (unsigned int x : results)
sum += x;
double totalElapsedTime = sum / million / results.size();
cout << "\t\t\tAverage elapsed: " << totalElapsedTime << " s." << endl;
}
}
答案 0 :(得分:3)
编译器必须知道与泛型一起使用的类型,因为它基本上必须制作一个与该类型兼容的Timer副本。
对于extern方法,没有办法知道这一点,并且必须在运行时对其进行评估,而泛型不是这样工作的。这是一个编译器功能。
您可以为特定类型制作包装,并制作外部包装。