雖然試圖複製在Visual Studio 2017年在此question行爲我發現,而不是鏈接&FuncTemplate<C>
完全相同的地址功能template<> FuncTemplate<C>() {}
被複制到DLLA和dllB從而使相應的測試程序總是返回not equal
。MSVC 2017年創建模板功能的拷貝共享庫
該解決方案設置爲3個Win32Projects,其中一個爲ConsoleApplication,其他爲DLL。爲了鏈接DLL,我將它們添加爲控制檯項目的引用(手動鏈接也不起作用)。我所做的代碼中唯一的變化是將__declspec(dllexport)
添加到a()
和b()
。
這是行爲標準嗎?似乎應該在這裏使用ODR來摺疊該函數的副本。有沒有辦法在另一個問題中看到同樣的行爲?
Template.h
#pragma once
typedef void (*FuncPtr)();
template<typename T>
void FuncTemplate() {}
class C {};
a.cpp - dll項目1
#include "Template.h"
__declspec(dllexport) FuncPtr a() {
return &FuncTemplate<C>;
}
b.cpp - dll項目2
#include "Template.h"
__declspec(dllexport)FuncPtr b() {
return &FuncTemplate<C>;
}
的main.cpp - 控制檯項目
#include <iostream>
#include "i.h"
// seems like there is no __declspec(dllimport) needed here
FuncPtr a();
FuncPtr b();
int main() {
std::cout << (a() == b() ? "equal" : "not equal") << std::endl;
return 0;
}
該標準不包括DLL –