我有两个类:一个是模板的,一个不是。我试图在非模板化的类中创建模板化类的实例,程序将无法编译。我正在使用Visual Studio 2012,我在bar.h中收到错误'IntelliSense:expect a type specifier':
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;
}
bar.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;
}
console.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;
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
你应该使用大括号初始化:
Foo<int> foo_complex{99};
C ++ 11允许 brace-or-equal-initializers 进行数据成员的内联初始化,因此其他有效的替代方法是(因为Foo<int>
是可移动构造的):
Foo<int> foo_complex = Foo<int>(99);
并且(因为Foo<int>
有一个非explicit
转换构造函数采用int
):
Foo<int> foo_complex = 99;
在C ++ 03中,当然,您可以在构造函数的初始化列表中初始化foo_complex
数据成员。
答案 2 :(得分:-1)
这是试图声明一个函数:
Foo<int> foo_complex(99);
我认为你说你需要一个类型说明符作为参数。您需要在构造函数中构造此对象,而不是在类定义中构造。
答案 3 :(得分:-1)
当您将对象声明为成员变量时,无法初始化对象,您必须在包含类构造函数初始化列表中执行此操作:
Bar::Bar(int i)
: foo_complex(99)
{
// ...
}
如果你的编译器足够新以支持C++11 uniform initialization,你应该能够做到这一点,但语法略有不同:
Foo<int> foo_complex{99};
注意大括号而不是括号。