1

我有两个类:一个是模板化的,一个不是。我正在尝试在非模板类中创建模板类的实例,并且程序将无法编译。我正在使用 Visual Studio 2012,我在 bar.h 中的这一行收到错误“IntelliSense:预期类型说明符”:

Foo<int> foo_complex(99);  

可以在类之外使用这种语法(参见下面的 console.cpp)。我可以在类中使用空构造函数。是什么赋予了?如何在 Bar 内正确使用 Foo 的非空构造函数?

在此先感谢您的帮助。我到处寻找解决方案,却一无所获。示例代码如下。为了清楚起见,类实现是内联的。

foo.h

#pragma once

template<typename T>
class Foo
{
public:
    Foo();
    Foo(int i);
};

template<typename T>
Foo<T>::Foo()
{
    std::cout << "You created an instance of Foo without a value." << std::endl;
}

template<typename T>
Foo<T>::Foo(int i)
{
    std::cout << "You created an instance of Foo with int " << i << std::endl;
}

酒吧.h

#pragma once

#include "foo.h"

class Bar
{
private:
    Foo<int> foo_simple;
    Foo<int> foo_complex(99); // Error ~ IntelliSense:expected a type specifier
public:
    Bar(int i);
};

Bar::Bar(int i)
{
    std::cout << "You created an instance of Bar with int " << i << std::endl;
}

控制台.cpp

#include "stdafx.h"
#include <iostream>
#include <string>
#include "foo.h"
#include "bar.h"

int _tmain(int argc, _TCHAR* argv[])
{
    Foo<int> foo(1);
    Bar bar(2);
    std::string any = "any";

    std::cout << std::endl;
    std::cout << "Press any key to close this window..." << std::endl;
    std::cin >> any; 
    return 0;
}
4

4 回答 4

1

在构造函数中初始化成员变量:

class Bar
{
private:
    Foo<int> foo_complex;
public:
    Bar(int i);
};

Bar::Bar(int i) : foo_complex(99)
{
    std::cout << "You created an instance of Bar with int " << i << std::endl;
}
于 2013-05-09T17:30:58.887 回答
0

您应该使用大括号初始化:

Foo<int> foo_complex{99};

C++11 允许使用大括号或等号初始化器对数据成员进行内联初始化,因此其他有效的替代方案是(因为Foo<int>是可移动构造的):

Foo<int> foo_complex = Foo<int>(99);

并且(因为Foo<int>有一个非explicit转换构造函数采用int):

Foo<int> foo_complex = 99;

当然,就像在 C++03 中一样,您可以foo_complex在构造函数的初始化列表中初始化您的数据成员。

于 2013-05-09T17:29:55.493 回答
-1

这是试图声明一个函数:

Foo<int> foo_complex(99);

我认为这是说您需要一个类型说明符作为参数。您需要在构造函数中构造此对象,而不是在类定义中。

于 2013-05-09T17:27:38.287 回答
-1

当您将对象声明为成员变量时,您无法对其进行初始化,您必须在包含类构造函数的初始化程序列表中进行初始化:

Bar::Bar(int i)
    : foo_complex(99)
{
    // ...
}

如果您的编译器足够新以支持C++11 统一初始化,那么您应该能够做到这一点,但语法略有不同:

Foo<int> foo_complex{99};

注意大括号而不是括号。

于 2013-05-09T17:28:57.040 回答