Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ dllexport/dllimport是否忽略成员模板函数?_C++_Visual Studio - Fatal编程技术网

C++ dllexport/dllimport是否忽略成员模板函数?

C++ dllexport/dllimport是否忽略成员模板函数?,c++,visual-studio,C++,Visual Studio,我现在正在使用VisualStudio。我有一个经典的宏来标记dll api函数和类。 我的理解是,标记一个类dllexport可以使它的函数从其他二进制文件中可见,从而可以使用dll提供的类型 我想知道当类包含模板成员函数时,dllexport和dllimport的行为是什么?我最初的怀疑是,它只是忽略它们,而这正是我想要的 但我在MSDN中找不到他们在哪里解释了这个具体案例(尽管他们解释了其他案例) 例如: class MY_API Log // MY_API is either _

我现在正在使用VisualStudio。我有一个经典的宏来标记dll api函数和类。 我的理解是,标记一个类dllexport可以使它的函数从其他二进制文件中可见,从而可以使用dll提供的类型

我想知道当类包含模板成员函数时,dllexport和dllimport的行为是什么?我最初的怀疑是,它只是忽略它们,而这正是我想要的

但我在MSDN中找不到他们在哪里解释了这个具体案例(尽管他们解释了其他案例)

例如:

    class MY_API Log // MY_API is either __declspec( dllexport ) or __declspec( dllimport ) depending on if we are compiling the library or using it's header
    {
    public:

            // is this ignored?
        template< typename TypeOfSomething >
        Log& write( const TypeOfSomething& something ) 
        {
            test_stream << something;
        }

        ~Log(); // ok this is exported/imported

    private:
          std::stringstream text_stream;
    };
class MY_API Log//MY_API是u declspec(dllexport)或u declspec(dllimport),这取决于我们是编译库还是使用库的头
{
公众:
//这被忽略了吗?
模板
记录和写入(常量类型的某物和某物)
{
TestJoStase

没有“模板函数”,C++有函数模板。 函数模板不是函数。它们是生成函数的方法。它们不存在于编译程序或DLL中。它们没有类型和地址。您无法导入或导出它们

从模板生成的函数(也称为函数模板实例化)是普通函数。它们可以放在DLL中导入和导出。但这样做通常没有什么意义。函数模板通常以源格式存在于头文件中,因此无需从DLL导入实例化。特别是考虑到DLL只能包含固定的、有限的实例化集,并且库总是可以请求不存在的实例化

有时将特定固定的实例化设置到DLL中是合理的,但这种情况很少见。

< P> >“模板函数”。C++有函数模板。

函数模板不是函数。它们是生成函数的方法。它们不存在于编译程序或DLL中。它们没有类型和地址。您无法导入或导出它们

从模板生成的函数(也称为函数模板实例化)是普通函数。它们可以放在DLL中导入和导出。但这样做通常没有什么意义。函数模板通常以源格式存在于头文件中,因此无需从DLL导入实例化。特别是考虑到DLL只能包含固定的、有限的实例化集,并且库总是可以请求不存在的实例化


有时,将一组特定的固定实例化放入DLL是合理的,但这种情况很少发生。

我知道,我要寻找的是一个明确的官方答案,即“dllexport/import是否会使用此成员函数做任何事情?”。我想您处于“灰色区域”.这很可能行不通。我要补充我的怀疑。@KirillKobelev“这行不通”是什么意思?问题是,在我的测试中,它确实编译并运行得很好。但我不知道官方行为应该是什么。我没有明确的官方答案,但包含指向的链接。简言之,是的,dllexport似乎被“忽略”对于函数模板。但是这种行为显然只针对VS。我知道,我要寻找的是一个明确的官方答案“dllexport/import是否会对该成员函数做任何事情?”。我认为您处于“灰色区域”.这很可能行不通。我要补充我的怀疑。@KirillKobelev“这行不通”是什么意思?问题是,在我的测试中,它确实编译并运行得很好。但我不知道官方行为应该是什么。我没有明确的官方答案,但包含指向的链接。简言之,是的,dllexport似乎被“忽略”对于函数模板。但是这种行为显然只针对VS。我显然知道所有这些,这不是我要问的。我要问的是,如果可能,从官方来源,使用dllexport/import关键字是否有影响,即使在逻辑上他们不应该做任何事情。例如,即使遵循您描述的逻辑,也可能是p如果实例化,则可能导入成员函数,因为它将在客户端代码中生成一个真实函数。这样的代码将被标记为dllimport,而它不应该被标记为dllimport。@Klaim,从模板生成的函数应该具有声明中赋予它的属性。任何冲突都应该与在非模板代码-如果声明一个常规函数
dlliport
但给它一个主体,会发生什么情况?@MarkRansom有三种可能,它们是对立的,这就是我提出这个问题的原因。1)生成的函数被标记为dlliport,因为客户端代码生成了它。然后,由于函数不应该出现链接错误不能导入,只能使用。2)生成的函数是内联的,使dllimport被忽略。3)编译器看到这是一个函数模板,并删除/忽略dllimport/export命令,在代码生成上不做任何其他操作。测试时:没有链接错误,也没有明显的奇怪行为。这可能是2)或3),但我不知道“规则"。您的示例代码没有说明显式实例化。Microsoft似乎没有在任何地方显式指定这种情况的行为。使用VS的实验表明,导出类的成员模板的显式实例化不会自动导出。我显然知道所有这些,这不是我要问的。我要问的是,是否使用dllexport/import关键字是否有影响,如果可能的话,可以从官方来源获得,即使在逻辑上他们不应该做任何事情。例如,即使遵循您描述的逻辑,如果实例化,成员函数也可能被导入,