gpt4 book ai didi

c++ - 模板类的 Visual Studio C++ 链接器问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:10 27 4
gpt4 key购买 nike

我仍然无法让它工作..

由于前向声明,我不得不将实现与我的泛型类之一的定义分开,现在我在尝试构建时遇到链接器错误。

IShader.h:

template <typename ShadeType> 
class IShader {

public:
template <typename T>
bool getProperty(const std::string& propertyName, ShaderProperty<T>** outProp);
};

所以它是一个具有不同泛型类型的泛型成员函数的泛型类

实现看起来像这样:

#include "MRIShader.h"

template <typename ShadeType> template <typename T>
bool IShader<ShadeType>::getProperty(const std::string& propertyName, ShaderProperty<T>** outProp){
std::map<std::string, IShaderProperty* >::iterator i = m_shaderProperties.find(propertyName);
*outProp = NULL;
if( i != m_shaderProperties.end() ) {
*outProp = dynamic_cast<ShaderProperty<T>*>( i->second );
return true;
}
return false;
}

但是我收到了这样的链接器错误:

error LNK2001: Nicht aufgelöstes externes Symbol ""public: bool __thiscall IShader<class A_Type>::getProperty<bool>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class ShaderProperty<bool> * *)" (??$getProperty@_N@?$IShader@VA_Type@@@@QAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAPAV?$ShaderProperty@_N@@@Z)".   SceneParser.obj

用于 bool,也用于许多其他类型。我已经通读了这篇文章: http://www.parashift.com/c++-faq-lite/templates.html

但添加

templace class IShader<bool>;

最后IShader.cpp 并没有解决问题。我还尝试在实现中的关键字“template”之前添加“export”关键字,但这只会给我一个语法错误。

在单独的文件(.h 和 .cpp)中声明和实现我的模板类的正确方法是什么?

谢谢!

最佳答案

您只为翻译单元中的类提供了一个可链接对象,但成员函数是在另一个参数上模板化的,也必须明确指定。

我不知道是否有更优雅的方式,但一个可编译的版本是:

template bool IShader<bool>::getProperty<bool>
(const std::string& propertyName,
ShaderProperty<bool>** outProp);

VC8 和 GCC 3.4 都允许省略 <bool>在函数名称之后。但是,我不确定这种情况下的正确语法。

但只要您在大型项目中的编译时间没有问题,就省去麻烦并将方法定义(标记为内联)放在 header 中。
如果您只是担心头文件的大小,请将定义移到另一个头文件中,例如IShaderImpl.h,您将其包含在 IShader.h 的末尾。

快速示例以消除疑虑:

// IShader.h
template<typename T>
struct ShaderProperty {};

template <typename T>
class IShader {
public:
template <typename U>
void getProperty(ShaderProperty<U>**);
};

// IShader.cpp
#include <iostream>
#include "IShader.h"

template<typename T> template<typename U>
void IShader<T>::getProperty(ShaderProperty<U>**)
{ std::cout << "moo" << std::endl; }

template class IShader<bool>;
template void IShader<bool>::getProperty(ShaderProperty<bool>**);

// main.cpp
#include "IShader.h"
int main() {
IShader<bool> b;
ShaderProperty<bool>** p;
b.getProperty(p);
}

关于c++ - 模板类的 Visual Studio C++ 链接器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1912056/

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