C++ 编译器如何处理间接方法类型推断?

C++ 编译器如何处理间接方法类型推断?,c++,c++11,c++14,C++,C++11,C++14,当我总是使用模板时,我总是创建一个名为Test.h的文件。这将包括模板化的签名以及与之相关的定义 我开始使用模板成员函数,并注意到如果成员调用模板方法,我可以将声明与实现分开。这怎么可能,因为我认为编译器需要生成模板化方法 编译失败的原始示例 MyTest.h class MyTest { public: MyTest(); ~MyTest(); template <typename T> int testMethod(T&&

当我总是使用模板时,我总是创建一个名为Test.h的文件。这将包括模板化的签名以及与之相关的定义

我开始使用模板成员函数,并注意到如果成员调用模板方法,我可以将声明与实现分开。这怎么可能,因为我认为编译器需要生成模板化方法

编译失败的原始示例


MyTest.h

class MyTest
{
 public:
     MyTest();
     ~MyTest();
    template <typename T>
    int testMethod(T&& var);
};
class MyTest
{
 private:
    template <typename T>
    int testMethod(T&& var);
 public:
     MyTest();
     ~MyTest();
    void testMethod2();
};

然而,当我有另一个成员调用它时,它就可以工作了,并且main不能直接访问它


MyTest.h

class MyTest
{
 public:
     MyTest();
     ~MyTest();
    template <typename T>
    int testMethod(T&& var);
};
class MyTest
{
 private:
    template <typename T>
    int testMethod(T&& var);
 public:
     MyTest();
     ~MyTest();
    void testMethod2();
};

问问自己,在实例化模板化方法时,翻译单元是否有该函数的可用定义?啊,好的,这是一个很好的思考方法。非常感谢。问问自己,在实例化模板化方法时,翻译单元是否有该函数的可用定义?啊,好的,这是一个很好的思考方法。非常感谢。
#include "MyTest.h"

MyTest::MyTest()
{

};

MyTest::~MyTest()
{

};

template <typename T>
int MyTest::testMethod(T&& var)
{
    return 0;
}

void MyTest::testMethod2()
{
    testMethod(5);
}
#include "MyTest.h"
int main()
{
    MyTest testClass;
    testClass.testMethod2();
    return 0;
}