首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数模板不会在VS2019表达式中编译

函数模板不会在VS2019表达式中编译
EN

Stack Overflow用户
提问于 2021-07-26 18:18:29
回答 1查看 166关注 0票数 0

我有一个有很多函数模板的项目,我在Visual 2017中写了这些模板,而且它总是工作得很好。现在我必须在VS2019中构建它,因为我需要在另一个用VS2019编写的项目中包含库,而这个东西不会构建。

有一个函数模板似乎存在问题,尽管它实际上并不抱怨该函数本身。当我在代码中调用它时,编译器只会说“标识符未找到”。但是,在名称空间中,就连InteliSense也能看到它,并毫无怨言地链接到它。只是编译器不会。

下面是有问题的代码:

代码语言:javascript
运行
复制
// declaration

namespace Oparse
{
    // lots of other functions, many of them templates
    template <typename T> OpModel<T> *_ModelPtr(T *receiver) { return new OpModel<T>(receiver); };
}


// Invocation

namespace Oparse
{

        template <class T, class U>
    class OpModelFactory
        : public OpNestable
    {
        public:
        OpModelFactory<T, U>(vector<U*> &receiver) : OpNestable(OP_MODELFACTORY), receiver(receiver) {};
        // other stuff

        void Serialize(string key, stringstream &stream, unsigned int indents)
        {
            
            for (unsigned int i = 0; i < receiver.size(); ++i)
            {
                // check if the instances are really of the type of this OpModel, otherwise there may be duplicates between polymorphic factories populating the same receiver.
                T *currentModel = dynamic_cast<T*>(receiver[i]);
                if (currentModel != NULL)
                {
                    OpModel<T> *parser = _ModelPtr<T>(currentModel);    // <-- identifier not found
                    parser->Serialize(key, stream, indents);
                    delete parser;
                }
            }
        };

        private:
        vector<U*> &receiver;
    }
}

如果我评论这个调用,项目就会构建,尽管在这个地方声明了更多的函数模板。我不知道该怎么做才能让链接器找到它。是否有任何Visual向导可以给我一个提示?我必须坦白地承认,我已经多年没有使用IDE了,这是我第一次在Visual 2019年.

这是错误的完整输出。还有第二条信息,但我发现它毫无帮助:

代码语言:javascript
运行
复制
1>D:\Orbiter_installs\Orbiter2016\Orbitersdk\Oparse\include\OpModel.h(138,27): error C3861: '_ModelPtr': identifier not found
1>D:\Orbiter_installs\Orbiter2016\Orbitersdk\Oparse\include\OpModel.h(152): message : see reference to class template instantiation 'Oparse::OpModelFactory<T,U>' being compiled

没有,没有更多的信息。我也看到过类似的信息,通常是“使用. $further信息”,但这是我所得到的全部信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-26 19:51:43

存在、循环依赖问题

Oparse.h中,您首先包括在实现Serialize时需要_ModelPtrOpModel.h,但是_ModelPtr只在后面的标头中定义。

您需要转发声明模板方法。

OpModel.h中,将以下内容写成:

代码语言:javascript
运行
复制
namespace Oparse
{
    template<typename T> class OpModel;
    template <typename T> OpModel<T>* _ModelPtr(T* receiver);
    // Remaining of OpModel.h...
    typedef map<string, pair<Oparse::OpValue*, vector<Oparse::OpValidator*>>> OpModelDef;
    typedef vector<pair<Oparse::OpValue*, vector<Oparse::OpValidator*>>> OpValues;
    ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68534725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档