c++中另一个类中的模板类实例化

Posted

技术标签:

【中文标题】c++中另一个类中的模板类实例化【英文标题】:template class instantiation in another class in c++ 【发布时间】:2015-10-04 11:28:55 【问题描述】:

我有一个模板类,当我在 main 中实例化时没有任何问题,但是当我尝试在另一个类中实例化它时会出现问题。有人可以告诉我解决方案吗

#include<iostream>
#include<string>
using namespace std;

template <class T>
class property 
public:
    property(string name)
    
        propertyName= name;
    
private:
    T item;
    string propertyName;
;
main()

    property<int> myIntProperty("myIntProperty");

上面的代码编译没有任何问题。 但是

#include<iostream>
#include<string>
using namespace std;

template <class T>
class property 
public:
    property(string name)
    
        propertyName= name;
    
private:
    T item;
    string propertyName;
;

class propertyHolder

    property<int> myIntProperty("myIntProperty");
;

此代码未编译。 给我像

这样的错误

main.cpp|19|错误:字符串常量之前的预期标识符| main.cpp|19|错误:字符串常量前应为 ',' 或 '...'|

谢谢, 哈里什

【问题讨论】:

您正在使用但没有阅读哪本 C++ 书籍? main 需要返回类型为 int,始终如此。 【参考方案1】:
property<int> myIntProperty("myIntProperty");

这是一个函数声明,因此它希望您在识别它之后插入一个默认参数,例如string s = "myIntProperty"

也许你想初始化一个名为myIntProperty的对象,

property<int> myIntProperty "myIntProperty";

这可以在 C++11 中完成,但你也可以在构造函数初始化列表中对其进行初始化,

// Header
class propertyHolder 
public:
    propertyHolder( string s );
private:
    property<int> myIntProperty;
;

// Source
propertyHolder::propertyHolder( string s ) :
    myIntProperty( s )


【讨论】:

感谢您解决了问题:)。你能再解释一下,或者指出我可以找到前一个案例中哪里出了问题的文档吗? @Harish Why C++11 in-class initializer cannot use parentheses? 这将导致“Most vexing parse”。【参考方案2】:

您想在 propertyHandler 类中声明字段。该语法不起作用,因为您不能在同一位置声明一个字段并为其赋值。

你可以删除它,并在构造函数中初始化:

property<int> myIntProperty;

propertyHolder(): myIntProperty("name") 

或使用 c++11 语法:

property<int> myIntProperty"name";

或将其声明为静态,然后他们声明如下:

static property<int> myIntProperty;

在类声明之后:

property<int> propertyHolder::myIntProperty("name");

【讨论】:

“该语法不起作用,因为您不能在同一位置声明一个字段并为其赋值。” 您不能在初始化之前进行赋值,是的。但正如您自己的答案所示,C++11 确实允许在类声明中进行初始化(即使您错误地将其称为“分配”)。 @ChristianHackl 我的话可能有点不正确,但据我所知,我显示了正确的代码。我正在尽力而为。如果你能告诉我正确的动作名称,我可以用它们来编辑我的答案,因为我学的是 C++ 而不是英文术语。 您的代码当然是正确的。但是您通常应该尝试在分配和初始化之间进行更多区分。它们是不同的东西。 @ChristianHackl 我明白,我只是不能 100% 正确地用英语说出来。但我正在尝试很多)

以上是关于c++中另一个类中的模板类实例化的主要内容,如果未能解决你的问题,请参考以下文章

C++泛型编程

C++多态模板类,模板类型对象的实例化

c++实例化一个对象

C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板成员函数的实例化

c# 中类的实例化

动态实例化嵌套在抽象类中的内部类