我尝试使用模板和结构,但它们不起作用。我搜索了很多,但我找不到解决方案。
#include <iostream>
using namespace std;
template<struct S>
int add(S s) {
return s.num + s.num2;
}
int main() {
struct {
int num = 10;
int num2 = 20;
} test;
cout << add(test) << endl;
return 0;
}
使用gcc,错误是:
test.cpp:5:17: error: ‘struct S’ is not a valid type for a template non-type parameter
test.cpp: In function ‘int add(S)’:
test.cpp:6:5: error: ‘s’ has incomplete type
test.cpp:5:17: error: forward declaration of ‘struct S’
test.cpp: In function ‘int main()’:
test.cpp:13:19: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
test.cpp:14:20: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
test.cpp:17:21: error: no matching function for call to ‘add(main()::<anonymous struct>&)’
test.cpp:17:21: note: candidate is:
test.cpp:6:5: note: template<<declaration error> > int add(S)
test.cpp:6:5: note: template argument deduction/substitution failed:
test.cpp:17:21: note: cannot convert ‘test’ (type ‘main()::<anonymous struct>’) to type ‘S’
答案 0 :(得分:8)
您无法在此处使用关键字struct
。使用class
或typename
(您仍然可以使用struct
实例化模板。
编辑:您的其他问题与struct
中的匿名main
有关。不记得我头脑中的规则(也许其他人可以解释它们),但这是一种非常奇怪的做事方式,所以我只提供一个有效的版本:http://ideone.com/VGIogH
有点相关:Can we have an anonymous struct as template argument?
再次编辑:您最初使用struct
中的匿名main
撰写的内容(在模板中替换struct
后)--std=c++11
,但不没有(即c ++ 03)。
答案 1 :(得分:6)
在C ++中,struct
和class
基本相同,只是默认访问说明符在前者中为public
,在后者中为private
。另一方面,定义模板类型参数的语法需要使用class
或typename
关键字(此处不要将class
与类混淆在OO意义上,它可以是任何类型)。
template <typename S> // equivalently class S
int add(S s) ...
答案 2 :(得分:1)
除了在模板中用typename替换struct之外,我的编译器(GCC)说你不能直接初始化你的struct成员,所以你可以这样做:
#include <iostream>
using namespace std;
template<typename S>
int add(S s) {
return s.num + s.num2;
}
int main() {
struct {
int num;
int num2;
} test;
test.num = 10;
test.num2 = 20;
cout << add(test) << endl;
return 0;
}
编辑:您必须让模板知道您的结构是什么:
#include <iostream>
using namespace std;
struct MyStruct {
int num;
int num2;
};
template<typename S>
int add(S s) {
return s.num + s.num2;
}
int main() {
MyStruct test;
test.num = 10;
test.num2 = 20;
cout << add(test) << endl;
return 0;
}
答案 3 :(得分:1)
你的问题是你曾经看过有人写道:
template<class A>
bool foo( A* a ) {
return *a;
}
或类似内容,并认为class
意味着A必须是class
。
这里实际发生的是C ++语法有时很糟糕。回到第一次写入的模板时,他们在模板参数列表中重用了一个关键字(class
)来表示“一个类型”,而不是你可以传递给模板的其他东西(比如{{1} })。
这是一个非常令人困惑的语法。碰巧,这相当于上面的内容:
int
除了让A更清楚A可以任何类型。
然而,当template<typename A>
bool foo( A* a ) {
return *a;
}
是在模板参数中指定“类型”的正确方法时,有很多C ++代码,所以C ++继续允许它。
答案 4 :(得分:-2)
它不适用于匿名类型,您必须在函数调用中指定类型:
#include <iostream>
using namespace std;
template<typename S>
int add(S s) {
return s.num + s.num2;
}
int main() {
struct A {
int num = 10;
int num2 = 20;
} test;
cout << add<A>(test) << endl;
return 0;
}